沉重的貨物
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;
}