在每年的比赛里,所有进入决赛的同学都会获得一件很漂亮的 t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
输入格式
输入包括多组数据。
每组数据第一行是两个整数 NN、MM(N \le 100N≤100,M \le 10000M≤10000),NN 表示大街上有几个路口,标号为 11 的路口是商店所在地,标号为 NN 的路口是赛场所在地,MM 则表示在成都有几条路。N=M=0N=M=0 表示输入结束。接下来 MM 行,每行包括 33 个整数 AA,BB,CC(1 \le A,B \le N,1 \le C \le 10001≤A,B≤N,1≤C≤1000),表示在路口 AA 与路口 BB 之间有一条路,我们的工作人员需要 CC 分钟的时间走过这条路。
输入保证至少存在 11 条商店到赛场的路线。
输出格式
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
样例输出
3 2
思路:最短路板子题
#include <cstring> #include <algorithm> #include <iostream> using namespace std ; const int N = 110, M = 10010 ; int g[N][N] ; int dist[N] ; bool st[N] ; int n, m ; void dijkstra(){ memset(dist,0x3f,sizeof dist) ; dist[1] = 0 ; memset(st,false,sizeof st) ; for(int i=0;i<n;i++){ int t = -1 ; for(int j=1;j<=n;j++){ if(!st[j] && (t == -1 || dist[t] > dist[j])){ t = j ; } } st[t] = true ; for(int j=1;j<=n;j++){ if(!st[j]){ dist[j] = min(dist[j],dist[t]+g[t][j]) ; } } } } int main(){ while(cin >> n >> m, n || m){ memset(g,0x3f,sizeof g) ; for(int i=0;i<m;i++){ int a, b, c ; cin >> a >> b >> c ; g[a][b] = g[b][a] = min(g[a][b],c) ; } dijkstra() ; cout << dist[n] << endl ; } return 0 ; }
...