SDUT2143图结构练习——最短路径
2016-08-16 20:19
363 查看
图结构练习——最短路径
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给定一个带权无向图,求节点1到节点n的最短路径。
输入
输入包含多组数据,格式如下。第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
输出
每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
示例输入
3 2 1 2 1 1 3 1 1 0
示例输出
1 0
提示:看了Floyd算法才发现这个题太简单了。
必须参考网址Floyd算法,就是用vis更快的找到从i到k的距离path,然后又用vis找到k到j的距离;
来源
赵利强
示例程序
///*****请参考提示里的链接,不然看解释也看不懂; #include <stdio.h> #include <string.h> #define Inf 0x3f3f3f3f int map[105][105],vis[105],path[105]; void dijkstra(int n,int begin,int end) { for(int i=1; i<=n; i++) { path[i]=map[begin][i]; }///*************将i到中间位置的距离全部表示出来; vis[begin]=1; path[begin]=0; int t; for(int i=2; i<=n; i++) { int min=Inf; for(int j=1; j<=n; j++) { if(!vis[j]&&path[j]<min) { min=path[j]; t=j; } }///找到i到中间点t的最短距离; vis[t]=1; for(int k=1; k<=n; k++) { if(!vis[k]) { if(path[t]+map[t][k]<path[k]) path[k]=path[t]+map[t][k]; } }///找到中间点t到k点的最短距离; } printf("%d\n",path[end]); } int main() { int n,m,v,u,c; while(~scanf("%d%d",&n,&m)) { if(m==0) printf("0\n"); else { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(j==i) map[i][j]=0; else map[i][j]=Inf; } memset(vis,0,sizeof(vis)); for(int i=1; i<=m; i++) { scanf("%d%d%d",&v,&u,&c); if(map[v][u]>c) map[v][u]=map[u][v]=c; } dijkstra(n,1,n); } } return 0; }
相关文章推荐
- SDUT 2143 图结构练习——最短路径 SPFA模板,方便以后用。。
- SDUT 2143 图结构练习——最短路径(Dijkstra 单源最短路径求解)
- SDUT 2143 图结构练习——最短路径
- [SDUT](2143)图结构练习——最短路径 ---单源最短路径(图)
- 图结构练习——最短路径(sdut_2143)
- sdut2143图结构练习——最短路径
- SDUT 2143 - 图结构练习——最短路径(dijkstra+模板)
- SDUT 2143 图结构练习——最短路径
- 【2143】图结构练习——最短路径 (Dijkstra算法)(SDUT)
- 【2143】图结构练习——最短路径 (Dijkstra算法)(SDUT)
- SDUT 2143 图结构练习——最短路径
- (模板题)sdut 2143 图结构练习——最短路径(SPFA求最短路)
- SDUT2143 图结构练习——最短路径
- SDUT2143 图结构练习——最短路径
- 图结构练习——最短路径---2143
- SDUT-图结构练习——最短路径
- OJ2143图结构练习——最短路径(迪杰斯特拉算法)
- SDUTOJ 2143 图结构练习——最短路径 邻接链表 SPFA算法
- SDUTOJ(2143)图结构练习——最短路径
- sdut oj2143 图结构练习——最短路径