2 1 1 2 3 3 3 1 2 5 2 3 5 3 1 2 0 0
3 2
此题也没什么好说的,题意简单明了,道路也都是双向,但同样由于N最大取到10000,我们仍然不能使用Floyd(小编TT),那还是使用dijkstra算法吧。
#include <cstdio> #include <cstring> #define maxn 100+5 #define INF 0xfffffff int map[maxn][maxn],dist[maxn],vis[maxn]; int n,m; void init() { for(int i=1; i<maxn; i++) for(int j=1; j<maxn; j++) if(i == j) map[i][j] = 0; else map[i][j] = INF; } int dijkstra(int u,int v) { memset(vis,0,sizeof(vis)); for(int i=1; i<=n; i++) dist[i] = map[u][i]; dist[u] = 0; for(int i=1; i<n; i++) { int pos,min; pos = u,min = INF; for(int j=1; j<=n; j++) if(!vis[j] && min>dist[j]) { pos = j; min = dist[j]; } vis[pos] = 1; for(int j=1; j<=n; j++) { if(!vis[j] && dist[j]>dist[pos]+map[pos][j]) dist[j] = dist[pos]+map[pos][j]; } } return dist[v]; } int main() { int a,b,c; while(scanf("%d%d",&n,&m)&&(n||m)) { init(); while(m--) { scanf("%d%d%d",&a,&b,&c); if(map[a][b] > c) { map[a][b] = map[b][a] = c; } } printf("%d\n",dijkstra(1,n)); } return 0; }