设计一个算法,输出从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("\n");

}

p=G->adjlist[u].firstarc;
//p指向v的第一个相邻点

while(p!=NULL)

{

w=p->adjvex;

if(visited[w]==0)
//若w顶点未访问,递归访问它

FindPath(G,w,v,path,d);

p=p->nextarc;
//p指向v的下一个邻接点

}

visited[u]=0;
//恢复环境,使该顶点可重新使用

}

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

时间: 2024-08-28 05:33:20

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

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

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

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

设计一个算法,採用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

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

#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

算法与数据结构基础8:C++实现有向图邻接表存储

前面实现了链表和树,现在看看图. 链表是一对一的对应关系: 树是一对多的对应关系: 图是多对多的对应关系. 图一般有两种存储方式,邻接表和邻接矩阵. 先看邻接表. 邻接表就是将图中所有的点用一个数组存储起来,并将此作为一个链表的头, 链表中保存跟这个点相邻的点(边点),如果有权值,则在边点中增加一权值字段. 因此,有向图邻接表的空间复杂度为O(v+e),无向图加倍. C++实现代码如下: // GraphList.h #include <iostream> #include <cstdi

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

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

设计一个算法求节点值为x和节点y值得两个节点的最近共同祖先

思想:采用非递归后序遍历二叉树b.当找到节点值为x的节点时将栈中所有节点值存放在anorx数组中(如图所示的二叉树,F节点的anorx为"ACF"),当找到节点值为y的节点时将栈中所有节点值存放在anory数组中(对于如图所示的二叉树,E节点的anory为"ACE"),当两个节点均已找到后,通过比较找到他们最近的公共祖先(对于如图所示的二叉树,F和E节点的最近公共祖先为C),对应的算法如下: int commancestor(BTNode *b,ElementTyp