Dijkstra模板
2015-07-29 16:12
337 查看
数据:
6 0 2 5 0 3 30 1 0 2 1 4 8 2 5 7 2 1 15 4 3 4 5 3 10 5 4 18 -1 -1 -1
#include<iostream> #include<cstring> #include<cstdio> #define INF 1000000 #define MAXN 20 int n,Edge[MAXN][MAXN],s[MAXN],dist[MAXN],path[MAXN]; void Dijkstra(int v0) { int i,j,k; for(i=0;i<n;++i) { dist[i] = Edge[v0][i];s[i] = 0; if(i!=v0&&dist[i]<INF)path[i] = v0; else path[i]=-1; } s[v0] = 1; dist[v0] = 0; for(i=0;i<n-1;++i) { int min = INF,u=v0; for(j=0;j<n;++j) { if(!s[j]&&dist[j]<min) { u = j;min = dist[j]; } } s[u] = 1; for(k=0;k<n;++k) { if(!s[k]&&Edge[u][k]<INF&&dist[u]+Edge[u][k]<dist[k]) { dist[k] = dist[u] + Edge[u][k];path[k] = u; } } } } int main() { int i,j; int u,v,w; scanf("%d",&n); while(1) { scanf("%d%d%d",&u,&v,&w); if(u==-1&&v==-1&&w==-1)break; Edge[u][v] = w; } for(i=0;i<n;++i) { for(j=0;j<n;++j) { if(i==j)Edge[i][j] = 0; else if(Edge[i][j]==0)Edge[i][j] = INF; } } Dijkstra(0); int shortest[MAXN]; for(i=1;i<n;++i) { printf("%d\t",dist[i]); memset(shortest,0,sizeof(shortest)); int k=0; shortest[k] = i; while(path[shortest[k]]!=0) { k++;shortest[k] = path[shortest[k-1]]; } k++;shortest[k] = 0; for(j=k;j>0;j--) printf("%d->",shortest[j]); printf("%d\n",shortest[0]); } return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解
- C++ Custom Control控件向父窗体发送对应的消息
- C++中拷贝构造函数的应用详解