码迷,mamicode.com
首页 > 编程语言 > 详细

设计一个算法,采用BFS方式输出图G中从顶点u到v的最短路径(不带权的无向连通图G采用邻接表存储)

时间:2015-07-18 12:40:05      阅读:358      评论:0      收藏:0      [点我收藏+]

标签:数据结构   广度遍历   非循环队列   最短逆路径   

思想:图G是不带权的无向连通图,一条边的长度计为1,因此,求带顶点u和顶点v的最短的路径即求顶点u和顶点v的边数最少的顶点序列。利用广度优先遍历算法,从u出发进行广度遍历,类似于从顶点u出发一层一层地向外扩展,当第一次找到顶点v时队列中便包含了从顶点u到顶点v最近的路径,如图所示,再利用队列输出最路径(逆路径),所以设计成非循环队列。

技术分享









对应算法如下:

typedef struct 

{

int data; //顶点编号

int parent; //前一个顶点的位置

} QUEUE; //非循环队列类型


void ShortPath(AGraph *G,int  u, int v)

{

//输出从顶点u到顶点v的最短逆路径

ArcNode *p;

int  w,i;

QUEUE qu[MAXV]; //非循环队列

int front=-1,rear=-1; //队列头尾指针

int visited[MAXV];

for(i=0;i<G->n;i++) //访问标志设置初值0

visited[i]=0;

rear++;

qu[rear].data=u; //顶点u进队

qu[rear].parent=-1;

visited[u]=1;

while(front<=rear) //队列不为空时循环

{

front++;

w=qu[front].data; //出队顶点w

if(w==v) //找到v时输出路径之逆并退出

{

i=front; //通过队列输出逆路径

while(qu[i].parent!=-1)

{

printf("%2d",qu[i].data);

i=qu[i].parent;

}

printf("%2d\n",qu[i].data);

break;

}

p=G->adjlist[w].firstarc; //找到w的第一邻接点

while(p!=NULL)

{

if(visited[p->adjvex]==0)

{

visited[p->adjvex]=1;

rear++; //将w的未访问过的邻接点进队

qu[rear].data=p->adjvex;

qu[rear].parent=front;

}

p=p->nextarc;

}

}

}


如图所示,求顶点0到3的最短逆路径的结果如下:

技术分享











邻接表:

【0】:1->4->^

        【1】:0->2->3->^

【2】:1->2->^

【3】:1->2->^

【4】:0->2->^

顶点0到顶点3的最短逆路径:3 1 0

版权声明:本文为博主原创文章,未经博主允许不得转载。

设计一个算法,采用BFS方式输出图G中从顶点u到v的最短路径(不带权的无向连通图G采用邻接表存储)

标签:数据结构   广度遍历   非循环队列   最短逆路径   

原文地址:http://blog.csdn.net/wuruiaoxue/article/details/46940345

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!