我是靠谱客的博主 优雅高山,这篇文章主要介绍Dijkstra算法andFloyd算法求最短路径问题,现在分享给大家,希望可以做个参考。

算法思想
令G=(V,E)为一个带权有向图,把图中的顶点集合v分成两组,第一组为已求出最短路径的顶点集合s(初始时只有源节点,以后每求得一条最短路径,就将他对应的顶点加入到集合s中直到全部顶点都加入到s中);第二组是未确定最短路径的顶点集合U。在加入的过程中,总保持源节点v到s中各顶点的最短路径长度不大于从源节点v到U中的任何顶点的最短路径长度。
2、算法步骤
(1)初始化时,S只含有源节点;
(2)从U中选取一个距离v最小的顶点k加入S中(该选定的距离就是v到k的最短路径长度);
(3)以k为新考虑的中间点,修改U中各顶点的距离;若从源节点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值是顶点k的距离加上k到u的距离;
(4)重复步骤(2)和(3),直到所有顶点都包含在S中。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const int MAX=1000; void Dijkstra(MGraph g, int v){ for ( i =0; i<g.vexnum ; i++){ dist[i]=g.arcs[v][i]; if ( dist[i]!= MAX) path [i]=g.vertex[v]+g.vertex[i]; else path[i]=“”; } S[0]=g.vertex[v]; num=1; while (num<g.vextexNum){ k=0; for(i=0;i<G.vertexNum;i++) if((dist[i]<dist[k]) k=i cout<<dist[k]<<path[k]; s[num++]=G.vertex[k]; for(i=0;i<G.vertexNum;i++) if(dist[k]+g.arc[k][i]<dist[i] { dist[i]=dist[k]+g.arc[k][i]; path[i]=path[k]+g.vertex[i]; } } }

Floyd算法基本思想如下:
设图G用邻接矩阵法表示,求图中任一一对顶点vivj的最短路径。
(-1)将vi到vj 的最短的路径长度初始化为(vi,vj), 然后进行如下n次比较和修正:
(0) 在vi、vj间加入顶点v0,比较(vi, v0, vj)和(vi, vj)的路径的长度,取其中较短的路径作为vi到vj的且中间顶点号不大于0的最短路径。
(1) 在vi、vj间加入顶点v1,
得(vi, …,v1)和(v1, …,vj),其中:
(vi, …, v1)是vi到v1 的且中间顶点号不大于0的最短路径,
(v1, …, vj) 是v1到vj 的且中间顶点号不大于0的最短路径,
这两条路径在上一步中已求出。
将(vi, …, v1, …, vj)与上一步已求出的且vi到vj 中间顶点号不大于0的最短路径比较,取其中较短的路径作为vi到vj 的且中间顶点号不大于1的最短路径。
(2)在vi、vj间加入顶点v2,得
(vi, …, v2)和(v2, …, vj), 其中:
(vi, …, v2)是vi到v2 的且中间顶点号不大于1的最短路径,
(v2, …, vj) 是v2到vj 的且中间顶点号不大于1的最短路径,
这两条路径在上一步中已求出。
将(vi, …, v2, …, vj)与上一步已求出的且vi到vj 中间顶点号不大于1的最短路径比较, 取其中较短的路径作为vi到vj 的且中间顶点号不大于2的最短路径。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Floyd(MGraph G) { for (i=0; i<G.vertexNum; i++) for (j=0; j<G.vertexNum; j++) { dist[i][j]=G.arc[i][j]; if (dist[i][j]!=) path[i][j]=G.vertex[i]+G.vertex[j]; else path[i][j]=""; } for (k=0; k<G.vertexNum; k++) for (i=0; i<G.vertexNum; i++) for (j=0; j<G.vertexNum; j++) if (dist[i][k]+dist[k][j]<dist[i][j]) { dist[i][j]=dist[i][k]+dist[k][j]; path[i][j]=path[i][k]+path[k][j]; } }

最后

以上就是优雅高山最近收集整理的关于Dijkstra算法andFloyd算法求最短路径问题的全部内容,更多相关Dijkstra算法andFloyd算法求最短路径问题内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部