题解 UVA544 【Heavy Cargo】
这是一道纯粹的坑题,我们可以用Floyd解决。
我们不妨先理一理这道题的坑点
1.与众不同,这道题目的城市名称是字符串,所以你要先将城市标号。
2.翻译有差错,输出时,每组数据中间要隔一个换行。
3.这是一张无向图,而不是有向图。
4.当n=r=0时,结束程序。
先将字符串编号
利用map,本质上是平衡二叉树,但是初学者可以理解为下标可以是乱七八糟的类型的数组。
我们建立一个map,它的下标是字符串。
然后即可将字符串标号。
接下来我们只需要将Floyd变形即可
因为这道题求的不是最短路径,所以我们不能用【模板】Floyd。我们知道,普通的Floyd是这样写的:
for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]); } } }
但是这道题目,我们只关心路径上的最小值,因此,我们便可以将其略加改动:
for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(dp[i][k]>dp[i][j]&&dp[k][j]>dp[i][j]) { dp[i][j]=min(dp[i][k],dp[k][j]); } } } }
应该很好理解吧。
AC代码
#include<bits/stdc++.h> using namespace std; int n,m; map<string,int>mp; int dp[201][201]; int main() { int cnt=0; while(cin>>n>>m) { if(n==0&&m==0) { return 0; } int i,j,k; mp.clear(); memset(dp,0,sizeof(dp)); int now=0; for(i=1;i<=m;i++) { string s1,s2; cin>>s1>>s2; if(!mp[s1]) { mp[s1]=++now; } if(!mp[s2]) { mp[s2]=++now; } cin>>dp[mp[s1]][mp[s2]]; dp[mp[s2]][mp[s1]]=dp[mp[s1]][mp[s2]]; } string st,en; cin>>st>>en; printf("Scenario #%d\n",++cnt); for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(dp[i][k]>dp[i][j]&&dp[k][j]>dp[i][j]) { dp[i][j]=min(dp[i][k],dp[k][j]); } } } } printf("%d tons\n\n",dp[mp[st]][mp[en]]); } return 0; }
0ms跑过!
不要妄图追上西坠的太阳,而是要在黎明前就等着它!
浙公网安备 33010602011771号