沉重的货物
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 #2170 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; }