题目链接。
分析:
本题只要考虑重边的问题,基本上就没其它问题了。
#include <stdio.h> #define MAXN 202 const int INF = (1<<26); int dis[MAXN], G[MAXN][MAXN], vis[MAXN]; void Init(int n){ int i, j; for(i=0; i<n; i++){ vis[i] = 0; } for(i=0; i<n; i++){ for(j=0; j<n; j++){ G[i][j] = INF; } } } void dijkstra(int v0, int n){ int i, j; for(i=0; i<n; i++){ dis[i] = G[v0][i]; } vis[v0] = 1; dis[v0] = 0; for(i=0; i<n; i++){ int x, m = INF; for(j=0; j<n; j++) if(!vis[j] && m > dis[j]) m = dis[x=j]; vis[x] = 1; for(j=0; j<n; j++) if(!vis[j] && dis[j] > dis[x] + G[x][j]){ dis[j] = dis[x]+G[x][j]; } } } int main(){ int n, m, i, u, v, w, S, T; while(scanf("%d %d", &n, &m) == 2){ Init(n); for(i=0; i<m; i++){ scanf("%d %d %d", &u, &v, &w); if(G[u][v] > w){ G[u][v] = G[v][u] = w; } } scanf("%d %d", &S, &T); dijkstra(S, n); if(dis[T] != INF) printf("%d\n", dis[T]); else printf("-1\n"); } return 0; }