bnuoj 20950 沉重的貨物 (最小生成樹)

沉重的貨物

1000ms                                       65536KB
 64-bit integer IO format: %lld      Java class name: Main

 

CUITCPC是一個專門生產大型貨運火車的工廠。他們的新型貨運火車XX V1.0,是如此之大,以至於可以運輸的貨物的重量並不取決於那個火車本身,而只是受限於你所通過的鐵路的承重。

給你出發和目標城市,你的任務就是求出火車從初始城市到目標城市的最大載重。

Input

 

輸入可能包括一組或者多組測試數據。每一個測試數據的前兩行是兩個整數:城市的數量n(2<=n<=1000)和鐵路的條數r(1<=r<= 19900)。

緊接着是r行,每一行描述一條連接兩個城市的鐵路以及這段鐵路所能承受的最大重量。城市名不會超過30個字符,也不會有空白字符出現在城市名中。承重是一個0-10000的整數。鐵路都是雙向的。

最後一行是兩個城市的名字:初始城市和目標城市。

輸入的結束條件是n和r都爲0

Output

 

對於每一組測試數據

輸出包括3行:

l  一行輸出"Scenario #x",其中x是測試數據的組數

l  一行輸出"y tons",其中y表示最大載重量

l  一個空行

Sample Input

4 3
ACM ICPC 100
ICPC World 80
World CPC 120
ACM CPC
5 5
ACM ICPC 100
ICPC World 80
World CPC 120
ACM Chengdu 220
Chengdu CPC 170
CPC ACM
0 0

Sample Output

Scenario #1
80 tons

Scenario #2

170 tons

既然要求最大的運貨量,肯定先從最大的載重量開始找,一直找到包含終點的線路爲止

#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define INF 0x3f3f3f
using namespace std;

int n,Min,k;
int l[1010];
int v[1010];
int c[1010][1010];
char s1[50];
char s2[50];
map<string,int> M;

void prim(int st,int en){
    int i,j,flag,Max;
    Min=INF;
    v[st]=1;
    memset(v,0,sizeof(v));
    memset(l,-1,sizeof(l));
    for(i=0;i<n;i++)
        if(c[st][i]!=-INF)
        l[i]=c[st][i];
    for(i=0;i<n;i++){
        Max=-1;
        for(j=0;j<n;j++)
        if(!v[j]&&Max<l[j]){
            flag=j;
            Max=l[j];
        }
        if(Min>Max)
            Min=Max;
        if(flag==en)
            break;
        v[flag]=1;
        for(j=0;j<n;j++)
            if(!v[j]&&l[j]<c[flag][j])
            l[j]=c[flag][j];
    }
}


int ss(char *s){
    if(M.count(s))
        return M[s];
    else{
        M[s]=k++;
        return M[s];
    }
}

int main(){
    int i,j,t,m,u,vv,x,l=1;
    while(scanf("%d%d",&n,&m),(n+m)){
        k=0;
        M.clear();
        for(i=0;i<=n;i++)
            for(j=0;j<=n;j++)
            c[i][j]=-INF;
        while(m--){
            scanf("%s%s%d",s1,s2,&x);
            u=ss(s1);
            vv=ss(s2);
            c[u][vv]=x;
            c[vv][u]=x;
        }
        scanf("%s%s",s1,s2);
        prim(M[s1],M[s2]);
        printf("Scenario #%d\n",l++);
        printf("%d tons\n\n",Min);
    }
    return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章