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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值