图结构练习——最短路径
2017-02-16 22:33
218 查看
Problem Description
给定一个带权无向图,求节点1到节点n的最短路径。Input
输入包含多组数据,格式如下。第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
Output
每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)Example Input
3 2 1 2 1 1 3 1 1 0
Example Output
1 0
#include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 110 #define max 0x3f3f3f3f int df[maxn][maxn]; int book[maxn]; int dist[maxn]; int n; void dijkstra(int vo) { int i,j,k,min,u; for(i=1;i<=n;i++) { dist[i]=df[vo][i]; } book[vo]=1; dist[vo]=0; for(i=2;i<=n;i++) { min=max; u=vo; for(j=1;j<=n;j++) { if(dist[j]<min&&book[j]==0) { u=j; min=dist[j]; } } book[u]=1; for(k=1;k<=n;k++) { if((dist[k]>dist[u]+df[u][k])&&book[k]==0&&df[u][k]<max) { dist[k]=dist[u]+df[u][k]; } } } } int main() { int m; int i,j,u,v,w; while(scanf("%d%d",&n,&m)!=EOF) { memset(df,max,sizeof(df)); memset(book,0,sizeof(book)); for(i=1;i<=n;i++) { df[i][i]=0; } while(m--) { scanf("%d%d%d",&u,&v,&w); if(df[u][v]>w) df[u][v]=df[v][u]=w; } dijkstra(1); printf("%d\n",dist ); } return 0; }
相关文章推荐
- SDUT OJ 2143 图结构练习——最短路径
- sdutacm-图结构练习——最短路径
- SDUT 2143 图结构练习——最短路径
- SDUT 2143 图结构练习——最短路径(Dijkstra 单源最短路径求解)
- 图结构练习——最短路径
- SDUT 2143 - 图结构练习——最短路径(dijkstra+模板)
- SDUTOJ(2143)图结构练习——最短路径
- 图结构练习——最短路径---2143
- 图结构练习——最短路径
- 图结构练习——最短路径 floyd算法 SDUT2143
- 图结构练习——最短路径(floyd算法(弗洛伊德))
- 图结构练习——最短路径
- 【2143】图结构练习——最短路径 (Dijkstra算法)(SDUT)
- sdut acm 图结构练习——最短路径
- 图结构练习——最短路径(dijkstra算法)
- 图结构练习——最短路径 (Floyd算法)
- 图结构练习——最短路径(Dijkstra算法)
- 【2143】图结构练习——最短路径 (Dijkstra算法)(SDUT)
- 图结构练习——最短路径(dijkstra算法(迪杰斯拉特))
- 图结构练习——最短路径