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

思想:图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

时间: 2024-10-01 03:12:02

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

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

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

设计一个算法,求不权无向图连通图G中距离顶点v的最远的一个顶点

思想:图G是不带权的无向连通图,一条边的长度为1,因此,求距离顶点v的最远的顶点,即求距离顶点v的边数最多的顶点.利用广度优先遍历算法,从v出发进行广度遍历,类似于从顶点v出发一层层地向外扩展,到达j, -,最后到达的一个顶点k即为距离v最远的顶点.遍历时利用队列逐层暂存各个顶点,最后出队的一个顶点k即为所求.如图所示: 对应的算法如下: int Maxdist(AGragh *G,int v) { ArcNode *p; int Qu[MAXV]; //循环队列 int front=0,rea

设计一个算法,输出从u到v的所有最短路径(采用邻接表存储)

思想:用path数组存放路径(初始为空),d表示路径长度(初始为-1),查找从顶点u到v的最短路径过程如图所示: 对应算法如下: void FindPath(AGraph *G,int u,int v,int path[ ],int d) { int w,i; ArcNode *p; d++; path[d]=u; visited[u]=1; //路径长度增1 if(u==v) { for(i=0;i<=d;i++) printf("%2d",path[i]); printf(&

A、B两个整数集合,设计一个算法求他们的交集

代码留作记录,本人水平有限,看了别人的解法真是自愧不如. 关于此题的详细探讨可以参考:http://blog.csdn.net/thebestdavid/article/details/12056293 /*A.B两个整数集合,设计一个算法求他们的交集,尽可能的高效.*/ #include <iostream> #include <cstring> #include <set> #define M 8 #define N 5 using namespace std; i

剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数

题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 在做这道题的时候我最先考虑的是每次比较对角线上的元素可能可以取得较好的效果, 以查找9为例, 从1(0,0)开始,1<10,可以得出结论,10在1的右侧或下侧: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 然后看4(1,1),4<9, 1 2 8 9 2

数据结构(11) -- 邻接表存储图的DFS和BFS

/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS /////////////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> #include <queue> using namespace std; //图的邻接表表示法

图的邻接表存储方式的建立

图的邻接表存储方式,主要由表节点与头结点组成. 头结点中主要包含两个域: 1)存放顶点信息 2)存放与顶点相连的第一个表节点的指针 表节点中主要包含两个域: 1)存放相连的节点的序号 2)指向下一个节点的指针 #define MAXNUM 100; //表节点 typedef struct ArcNode{ int adjvex;//邻接顶点编号 struct ArcNode *next;//下一邻接顶点 }ArcNode; //头结点 typedef struct AdjList{ char

设计一个算法,输出从每个叶子节点到根节点的逆路径

下面使用三种遍历方法输出逆路径,假设二叉树采用二叉链存储结构存储. 方法1:采用基于层次遍历的方法,设计的队列为非环形顺序队列,将所有已扫描的节点指针进队,并在队列中保存双亲节点的位置.当找到一个叶子节点时,在队列中通过双亲节点的位置输出该叶子节点到根节点的逆路径.对应的算法如下: void AllPath(BTNode * b) { struct snode { BTNode *node; //存放当前节点指针 int parent; //存放双亲节点在队列中的位置 } Qu[MaxSize]

设计一个算法将一个顺序表逆置

#include<iostream> #include<malloc.h> using namespace std; typedef struct { int length;//保存长度 int data[40];//数组 } SqList; /*算法1:设计一个高效的算法,将顺序表中的所有元素逆置.要求算法空间股咋度为o(1)*/ //初始化顺序表 void initReverse(SqList &s,int *a,int l){ s.length=0; //插入元素 f