Problem Description
给定一个带权无向图,求节点1到节点n的最短路径。
Input
输入包含多组数据,格式如下。
第一行包括两个整数n m,代表节点个数和边的个数。(n<=100)
剩下m行每行3个正整数a b c,代表节点a和节点b之间有一条边,权值为c。
Output
每组输出占一行,仅输出从1到n的最短路径权值。(保证最短路径存在)
Sample Input
3 2 1 2 1 1 3 1 1 0Sample Output
1 0
#include<bits/stdc++.h> using namespace std; #define INF 0x3f3f3f3f int mp[110][110]; int vis[110]; int dis[110]; void Dijkstra(int n, int Start, int End) { int k; for(int i = 1; i <= n; i++) dis[i] = mp[Start][i]; vis[Start] = 1; dis[Start] = 0; for(int i = 2; i <= n; i++) { int Min = INF; for(int j = 1; j <= n; j++) { if(!vis[j] && dis[j] < Min) { Min = dis[j]; k = j; } } vis[k] = 1; for(int j = 1; j <= n; j++) { if(!vis[j]) { if(dis[k]+mp[k][j] < dis[j]) dis[j] = dis[k] + mp[k][j]; } } } printf("%d\n", dis[End]); } int main() { int n, m, a, b, c; while(~scanf("%d%d", &n, &m)) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(i == j) mp[i][j] = 0; else mp[i][j] = INF; } } memset(vis, 0, sizeof(vis)); if(m == 0) printf("0\n"); else { while(m--) { scanf("%d%d%d", &a, &b, &c); if(mp[a][b] > c) mp[a][b] = mp[b][a] = c; } Dijkstra(n, 1, n); } } }