POJ 2263 Heavy Cargo(ZOJ 1952)

最短路变形或最大生成树变形。


问 目标两地之间能通过的小重量。

用最短路把初始赋为INF。其它为0.然后找 dis[v]=min(dis[u], d);

生成树就是把最大生成树找出来。直到出发和终点能沟通的时候,最小的边就是。


Kruskal:

#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<stack>
#include<iostream>
#include<list>
#include<set>
#include<cmath>
#define INF 0x7fffffff
#define eps 1e-6
#define LL long long
using namespace std;
int n,m;
int fa[201];
map<string,int>city;
struct lx
{
    int u,v,len;
}l[19901];

int father(int x)
{
    if(x!=fa[x])
        return fa[x]=father(fa[x]);
}

bool cmp(lx a, lx b)
{
    return a.len>b.len;
}

int main()
{
    int nn=1;
    while(scanf("%d%d",&n,&m),n||m)
    {
        for(int i=0;i<=n;i++)
            fa[i]=i;
            city.clear();
        char a[31],b[31];
        int len,u,v,cot=0;
        for(int i=0;i<m;i++)
        {
            scanf("%s%s%d",a,b,&len);
            u=city[a];
            if(u==0)city[a]=cot++;
            u=city[a];
            v=city[b];
            if(v==0)city[b]=cot++;
            v=city[b];

            l[i].u=u,l[i].v=v,l[i].len=len;

        }
        scanf("%s%s",a,b);
        int x=city[a];
        int y=city[b];

        sort(l,l+m,cmp);
        int ans=INF;
        for(int i=0;i<m;i++)
        {
            u=father(l[i].u);
            v=father(l[i].v);
            if(u==v)continue;
            fa[v]=u;
            ans=min(ans,l[i].len);

            if(father(x)==father(y))break;
        }
        printf("Scenario #%d\n%d tons\n\n",nn++,ans);
    }
}


posted @ 2017-05-15 09:27  wzzkaifa  阅读(150)  评论(0编辑  收藏  举报