暢通工程續
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8903 Accepted Submission(s): 2967
現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。
每組數據第一行包含兩個正整數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),分別代表起點和終點。
int main(){
int a[200][200],n,m,x,y,weight,s,t,i,j;
int flag;
while(scanf("%d%d",&n,&m)!=EOF){
for(i=0;i<n;i++){
for(j=0;j<n;j++){
a[i][j]=-1;
}
}
while(m--){
scanf("%d%d%d",&x,&y,&weight);
if(a[x][y]==-1||a[x][y]>weight) a[x][y]=weight,a[y][x]=weight;
}
scanf("%d%d",&s,&t);
if(s==t){
printf("0\n");
continue;
}
flag=1;
while(flag){
flag=0;
for(i=0;i<n;i++){
if(a[s][i]!=-1){
for(j=0;j<n;j++){
if(a[i][j]!=-1&&(a[s][i]+a[i][j]<a[s][j]||a[s][j]==-1)){
a[s][j]=a[s][i]+a[i][j];
flag=1;
}
}
}
}
}
printf("%d\n",a[s][t]);
}
return 0;
}