hdu 1874暢通工程續(dijkstra演算法)
阿新 • • 發佈:2019-01-05
暢通工程續
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 42824 Accepted Submission(s): 15882Problem Description 某省自從實行了很多年的暢通工程計劃後,終於修建了很多路。不過路多了也不好,每次要從一個城鎮到另一個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。
現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。 Input
每組資料第一行包含兩個正整數N和M(0<N<200,0<M<1000),分別代表現有城鎮的數目和已修建的道路的數目。城鎮分別以0~N-1編號。
接下來是M行道路資訊。每一行有三個整數A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城鎮A和城鎮B之間有一條長度為X的雙向道路。
再接下一行有兩個整數S,T(0<=S,T<N),分別代表起點和終點。 Output 對於每組資料,請在一行裡輸出最短需要行走的距離。如果不存在從S到T的路線,就輸出-1.
Sample Input 3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2
#include<iostream> #include<string> #include<cstring> using namespace std; const int maxint=10000001; const int maxnum=250; void Dijkstra(int n,int v,int* dist,int c[maxnum][maxnum]) { bool s[maxnum]; for(int i=0;i<n;i++) { s[i]=0; dist[i]=c[v][i]; } dist[v]=0; s[v]=0; for(int i=1;i<n;i++) { int max=maxint; int u=v; for(int j=0;j<n;j++) { if((!s[j])&&dist[j]<max) { u=j; max=dist[j]; } } s[u]=1; for(int j=0;j<n;j++) { if((!s[j])&&c[u][j]<maxint) { int newdist=dist[u]+c[u][j]; if(newdist<dist[j]) dist[j]=newdist; } } } } int main() { int dist[maxnum]; int c[maxnum][maxnum]; int p,q,len; int i,j,k; int n,line; int a,b; ios::sync_with_stdio(false); while(cin>>n>>line) { for(i=0;i<n;i++) { dist[i]=maxint; for(j=0;j<n;j++) { c[i][j]=maxint; } } for(i=0;i<line;i++) { cin>>p>>q>>len; if(len<c[p][q]) { c[p][q]=len; c[q][p]=len; } } cin>>a>>b; //Dijkstra(n,1,dist,prev,c); Dijkstra(n,a,dist,c); if(dist[b]==maxint) cout<<"-1"<<endl; else cout<<dist[b]<<endl; } return 0; }