题解 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]);
        }
    }
}
View Code

但是这道题目,我们只关心路径上的最小值,因此,我们便可以将其略加改动:

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]);
            }
        }
    }
}
View Code

应该很好理解吧。

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

0ms跑过!

posted @ 2020-08-08 15:17  Bushuai_Tang  阅读(111)  评论(0编辑  收藏  举报