Dijkstra 算法求单源最短路径
2012-08-09 14:00
369 查看
//Dijkstra算法只能处理正边权问题 #include <iostream> #include<stdio.h> #include<string.h> #define MAX 100 #define VALUE 0xffffff using namespace std; int g[MAX][MAX]; int d[MAX];//某一点到所有点的最短距离 bool used[MAX];//已经被使用的标记 int v,e;//点数和边数 void createGraph() { int i; int start,end,weight; memset(g,0,sizeof(g)); scanf("%d%d",&v,&e); for(i=0;i<e;i++) { //无向带权图 scanf("%d%d%d",&start,&end,&weight); g[start][end] = weight; g[end][start] = weight; } } //从某一个点s到任意一点的最短距离 void Dijkstra(int s) { int i; for(i = 1;i<=v;i++) { d[i] = VALUE;//起先设置s点到其他点的最短距离为无穷大 used[i] = false;//设置每个点都没被访问过 } d[s] = 0;//该点到本身的距离为1 while(true) { int u, t=-1; //从尚未使用的顶点找出距离最短的 for(u = 1;u<=v;u++) { //遍历每个点,如果该店没有被使用过,并且(t==-1或者s到u的距离小于s到t的距离(找出与s相连的权值最小的边对应的点t)) if(!used[u] && (t==-1 || d[u]<d[t])) t = u; } //第一次的时候t等于s //当全部点被访问完后,t==-1 if(t == -1) break; used[t] = true;//标记t点被访问过 for(u=1;u<=v;u++) {//如果s到u的最短距离大于s到t的最短距离加上t到u的权值(t到u有边),那么更新s点到任意一点的距离 if(d[u]>d[t]+g[t][u] && g[t][u]!=0) d[u] = d[t]+g[t][u]; } } for(int u=1;u<=v;u++) { printf("%d ",d[u]); } printf("\n"); } int main() { createGraph(); Dijkstra(1); return 0; } /* 5 8 1 2 2 2 3 3 3 4 2 4 5 3 1 3 5 1 4 1 2 4 7 2 5 3 */
相关文章推荐
- Dijkstra算法求单源最短路径
- [Dijkstra单源最短路径算法]算法思想速成
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 单源最短路径---迪杰克斯拉算法(Dijkstra)
- 迪杰斯特拉(Dijkstra)算法求解单源最短路径及其相应长度(java实现)
- Dijkstra 单源最短路径算法
- 贪心算法 - 单源最短路径 Dijkstra
- [算法导论] 单源最短路径 - Dijkstra 学习笔记
- 单源最短路径算法模板(Dijkstra+BellmanFrod)
- 算法与数据结构-单源最短路径之Dijkstra
- Dijkstra单源最短路径算法; 优先队列+静态数组邻接表; STL优先队列还是没想明白排序原则;
- 单源最短路径算法模板(Dijkstra+BellmanFrod)
- POJ 1847 Tram(Dijkstra单源有向图最短路径算法)
- 贪心算法之最小生成树prim与单源最短路径dijkstra
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路)Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- Dijkstra算法求解单源最短路径
- Dijkstra算法求单源最短路径
- 单源最短路径的Dijkstra 算法
- Dijkstra算法求单源最短路径(二)(BFS的改版)
- 贪心算法 Dijkstra 单源最短路径