原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874
分析:SPFA|Dijkastra.
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<vector> 7 #include<queue> 8 #define ll long long 9 #define inf 0x6fffffff 10 #define maxn 205 11 using namespace std; 12 int g[maxn][maxn],dis[maxn],n,m; 13 bool vis[maxn]; 14 void dijkastra(const int s) 15 { 16 for(int i=0;i<n;i++)dis[i]=g[s][i]; 17 memset(vis,false,sizeof(vis)); 18 for(int i=0;i<n;i++) 19 { 20 int mark=-1,mindis=inf; 21 for(int j=0;j<n;j++) 22 if(!vis[j]&&dis[j]<=mindis) 23 { 24 mark=j;mindis=dis[j]; 25 } 26 if(mark==-1)return; 27 vis[mark]=true; 28 for(int j=0;j<n;j++) 29 if(!vis[j]&&j!=mark)dis[j]=min(dis[j],dis[mark]+g[mark][j]); 30 } 31 } 32 int main() 33 { 34 while(~scanf("%d%d",&n,&m)) 35 { 36 for(int i=0;i<n;i++) 37 for(int j=0;j<n;j++) 38 { 39 g[i][j]=inf; 40 if(i==j)g[i][j]=0; 41 } 42 int u,v,t,s; 43 for(int i=0;i<m;i++) 44 { 45 scanf("%d%d%d",&u,&v,&t); 46 if(g[u][v]>t) 47 { 48 g[u][v]=t; 49 g[v][u]=t; 50 } 51 } 52 scanf("%d%d",&s,&t); 53 dijkastra(s); 54 printf("%d ",dis[t]>=inf?-1:dis[t]); 55 } 56 return 0; 57 }