Dijkstra最短路径算法
来源:互联网 发布:深圳信科网络 编辑:程序博客网 时间:2024/06/07 23:37
Floyd最短路径算法虽然简便,但是做题时始终容易超时,最合适的还是使用Dijkstra最短路径算法。
使用二维数组e存储顶点间边的关系,如图:
使用一维数组dis存储起点(此处为1号)到其余各顶点的初始路径,如图:
算法的基本思想
将所有顶点分为两部分:构成最短路径的顶点集合P和剩余顶点集合Q。初始化时,P集合中仅有起点,其余顶点均在Q集合中,在程序中我们通过设置visited数组来区别顶点的归属,如visited[i]=1,表示属于P;否则属于Q。
每次循环时,在集合Q的所有顶点中选择离起点距离最近的顶点u加入到集合P中,并修改dis数组中的值。例如存在一条从u到v的边,那么将边u->v添加到尾部若满足dis[u] + e[u][v] < dis[v],则我们修改s->v的路径值dis[v]=dis[u] + e[u][v]。
循环结束的条件是Q集合为空,最终dis数组的值就是起点到所有顶点的最短路径。
#define INFINITY 1999999999void Dijkstra(vector< vector<int> > arc, vector<int> &D){ vector<int> visited(n, 0); int i, j, k; int min; for (i = 0; i < n; i++) D[i] = arc[st][i]; visited[st] = 1; for (i = 1; i < n; i++) { min = INFINITY; for (j = 0; j < n; j++) { if (!visited[j] && D[j] < min) { min = D[j]; k = j; } } visited[k] = 1; for (j = 0; j < n; j++) { if (!visited[j] && (min + arc[k][j] < D[j])) D[j] = min + arc[k][j]; } }}
/*统计最短路径数目*/#define INFINITY 1999999vector< vector<int> > arc(n, vector<int>(n,INFINITY));vector<int> cnt(n,1); //统计最短路径的数目vector<int> D(n,INFINITY);int v0 = 0;void Dijkstra(vector< vector<int> > arc, vector<int> &D, vector<int> cnt){ int i, j, k; int min; vector<int> visited(n,0); for(i=0;i<n;i++) { D[i]=arc[v0][i]; cnt[i]=1; } D[v0]=0; visited[v0]=1; for(i=1;i<n;i++) { min=INFINITY; for(j=0;j<n;j++) { if(!visited[j] && D[j]<min) { min=D[j]; k=j; } } visited[k]=1; for(j=0;j<n;j++) { if(!visited[j]) { if(min+arc[k][j]<D[j]) { D[j]=min+arc[k][j]; cnt[j]=cnt[k]; } else if(min+arc[k][j]==D[j]) { cnt[j]+=cnt[k]; } } } }}
0 0
- DIJKSTRA最短路径算法
- 最短路径算法-dijkstra
- dijkstra最短路径算法
- 最短路径 Dijkstra算法
- 最短路径(Dijkstra算法)
- 最短路径Dijkstra算法
- 最短路径 Dijkstra算法
- Dijkstra最短路径算法
- 最短路径dijkstra算法
- 最短路径 dijkstra算法
- 最短路径Dijkstra 算法
- 最短路径 (Dijkstra算法)
- Dijkstra最短路径算法
- 最短路径(Dijkstra算法)
- 最短路径--Dijkstra算法
- Dijkstra最短路径算法
- Dijkstra最短路径算法
- Dijkstra最短路径算法
- Sql Server 2012 存储过程的单步调试
- 博弈论初步
- Ruby meta programming 1(binding/send/freeze/remove_method)
- HDOJ 4801 Qin Shi Huang's National Road System 次小生成树
- java-IO 文件作为数据库的学生管理系统
- Dijkstra最短路径算法
- linux mysql
- String,StringBuffer,StringBuilder的区别
- leetcode:二叉树之Binary Tree Postorder Traversal
- iOS Quartz2D实战系列-手把手教你手势解锁
- 设计模式(九)模版方法模式
- HDU1024->线性DP
- PHP 闭包函数及Closure对象的总结
- dtrace 在redhat 6.2上 安装