http://acm.hdu.edu.cn/showproblem.php?pid=1874
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include<vector> #include<algorithm> using namespace std; const int maxn=100007; const int INF=0x3f3f3f3f; int maps[1007][1007]; int dist[maxn]; int vis[maxn]; int n, m; int S, E; void Init() { memset(vis, 0, sizeof(vis)); for(int i=0; i<=n; i++) { for(int j=0; j<=n; j++) maps[i][j]=(i==j)?0:INF; dist[i]=INF; } } int dij() { for(int i=0; i<n; i++) dist[i]=maps[S][i]; vis[S]=1; for(int i=0; i<n; i++) { int Min=INF; int index; for(int j=0; j<n; j++) { if(!vis[j]&&dist[j]<Min) { Min=dist[j]; index=j; } } vis[index]=1; for(int j=0; j<n; j++) if(!vis[j]&&dist[j]>Min+maps[index][j]) dist[j]=Min+maps[index][j]; } return dist[E]; } int main() { while(~scanf("%d %d", &n, &m)) { Init(); while(m--) { int u, v, w; scanf("%d %d %d", &u, &v, &w); maps[u][v]=maps[v][u]=min(maps[u][v], w); } scanf("%d %d", &S, &E); int ans=dij(); if(ans>=INF) printf("-1 "); else printf("%d ", ans); } }