要求:求带权有向图中某一结点到其他结点的最短路径。
用迪杰斯特拉算法求解,迪杰斯特拉算法书上的描述如下:
对于图G=(V,{E}),将图中的顶点归为两组:
第一组S:已求出的最短路径的终点集合(开始为{v0})
第二组:V-S尚未求出的最短路径的顶点的集合(开始为V-{v0}的全部顶点)
该算法将最短路径长度的递增顺序逐个将第二组中的顶点加入到第一组中,直到所有的顶点都被加入到第一组顶点集S为止。
这是书上的描述,比较抽象,本人将自己的理解与大家分享如下:
思路:
1首先初始化工作:三个准备数组path保存从v到i的路径,dist保存从v到i的最短路径,visit保存当前访问点是 已加入G中
2 初始化:若dist不为INFINITY则将v加入到path[i]中,将visit置false,将dist置能直达的距离
3然后将处顶点v外的其余n个顶点加入G中,所以应采用for循环n-1次,每次选取dist最小的顶点k加入G中
4加入后得重新求dist,因为k加入后可作中转站供原本不能走通的路径走通,一旦第i个顶点的dist重新修改后, 得将顶点k加入到i的path路径中
基于以上步骤代码如下:
#includeusing namespace std;const int INFINITY=23678;const int M=3;/*typedef struct G{int ver[M];int arc[M][M];int vernum,arcnum;}G;*/void path_(int n,int g[][M],int v)//为了简化过程,专注算法本质,将图的数据结构直接用数组加定点数来代替{int dist[M],path[M],visit[M];int k;//k用来保存每次选出的最小的路径的顶点的下标for(int i=0;i
程序运行结果如下:
注:x<--y表示从y到x的最短路径,上图输出的是给定数组g[M][N]中的每个顶点到顶点2的最短路径。