Dijkstra模板求单源点最短路径
2017-08-04 23:06
435 查看
#include <iostream> using namespace std; const int maxnum = 100; const int maxint = 999999; // 各数组都从下标1开始 int dist[maxnum]; // 表示当前点到源点的最短路径长度 int prev[maxnum]; // 记录当前点的前一个结点 int c[maxnum][maxnum]; // 记录图的两点间路径长度 int n, line; // 图的结点数和路径数 // n -- n nodes // v -- the source node // dist[] -- the distance from the ith node to the source node // prev[] -- the previous node of the ith node // c[][] -- every two nodes' distance void Dijkstra(int n, int v, int *dist, int *prev, int c[maxnum][maxnum]) { bool s[maxnum]; // 判断是否已存入该点到S集合中 for(int i=1; i<=n; ++i) { dist[i] = c[v][i]; s[i] = 0; // 初始都未用过该点 if(dist[i] == maxint) prev[i] = 0; else prev[i] = v; } dist[v] = 0; s[v] = 1; // 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S中 // 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度 // 注意是从第二个节点开始,第一个为源点 for(int i=2; i<=n; ++i) { int tmp = maxint; int u = v; // 找出当前未使用的点j的dist[j]最小值 for(int j=1; j<=n; ++j) if((!s[j]) && dist[j]<tmp) { u = j; // u保存当前邻接点中距离最小的点的号码 tmp = dist[j]; } s[u] = 1; // 表示u点已存入S集合中 // 更新dist for(int j=1; j<=n; ++j) if((!s[j]) && c[u][j]<maxint) { int newdist = dist[u] + c[u][j]; if(newdist < dist[j]) { dist[j] = newdist; prev[j] = u; } } }
相关文章推荐
- 单源最短路径算法模板(Dijkstra+BellmanFrod)
- 洛谷 P3371 【模板】单源最短路径(Dijkstra + 堆优化)
- 单源最短路径算法模板(Dijkstra+BellmanFrod)
- 【模板】 Dijkstra单源最短路径 (模板题:XJOI P1061)
- 单源最短路径Dijkstra、BellmanFord、SPFA【模板】
- P3371 【模板】单源最短路径 SPFA优化 dijkstra堆优化
- [模板] Dijkstra单源最短路径
- [洛谷]P3371 单源最短路径模板 Dijkstra
- Dijkstra单源最短路径
- 洛谷P3371 【模板】单源最短路径
- 单源最短路径---Dijkstra
- 浅析最小生成树和单源最短路径的区别(含Prim、Kruskal、Dijkstra、Bellman-Ford)
- 单源最短路径:Dijkstra 算法 Bellman_Ford 算法 SPFA 算法
- 【模板】最短路径(Dijkstra 4heap)
- 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
- Dijkstra算法求单源最短路径
- 单源最短路径---迪杰克斯拉算法(Dijkstra)
- Dijkstra求单源最短路径
- 洛谷 P3371 【模板】单源最短路径
- Dijkstra 邻接矩阵 单源点最短路径