HDU 1874 暢通工程續 最短路徑
阿新 • • 發佈:2018-12-16
題意: 根據給出的路徑,找出從起點s 到 終點e的最短路徑輸出即可
Dijkstra演算法
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; const int maxn=210; int n,m,s,e; int g[maxn][maxn],dis[maxn],vis[maxn]; void Dijkstra(int s){ int i; for(i=0;i<n;i++){ dis[i]=g[s][i]; vis[i]=0; } dis[s]=0; vis[s]=1; int j,k,tmp; for(i=0;i<n;i++){ tmp=INF; for(j=0;j<n;j++) if(!vis[j] && tmp>dis[j]){ k=j; tmp=dis[j]; } if(tmp==INF) break; vis[k]=1; for(j=0;j<n;j++) if(!vis[j] && dis[j]>dis[k]+g[k][j]) dis[j]=dis[k]+g[k][j]; } } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ int u,v,w; for(int i=0;i<n;i++) for(int j=0;j<n;j++) g[i][j]=INF; for(int 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,&e); Dijkstra(s); if(dis[e]==INF) printf("-1\n"); else printf("%d\n",dis[e]); } return 0; }