hdu 1874 hdoj 1874

暢通工程續

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8903    Accepted Submission(s): 2967


Problem 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
 

Sample Output
2 -1
 
#include<stdio.h>
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章