B-道路建设

链接:
https://www.nowcoder.net/acm/contest/76/B

来源:牛客网

题目描述

随着如今社会的不断变化,交通问题也变得越来越重要,所以市长决定建设一些公路来方便各个城市之间的贸易和交易。虽然市长的想法很好,但是他也遇到了一般人也经常头疼的问题,那就是手头的经费有限……在规划过程中,设计师们已经预算出部分城市之间建设公路的经费需求。现在市长想知道,它能不能将他的m个城市在有限的经费内实现公路交通。如果可以的话,输出Yes,否则输出No(两个城市不一定要直接的公路相连,间接公路到达也可以。)

输入描述:

测试输入包含多条测试数据
每个测试数据的第1行分别给出可用的经费c(<1000000),道路数目n(n<10000),以及城市数目m(<100)。
接下来的n行给出建立公路的成本信息,每行给出三个整数,分别是相连的两个城市v1、v2(0<v1,v2<=m)以及建设公路所需的成本h(h<100)。

输出描述:

对每个测试用例,输出Yes或No。

题意:求一个图的最小生成树,判断其花费是否超过你的经费。

思路:kruskal水过,注意是双向边。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node
{
    ll u,v,w;
}edge[20020];
ll c,n,m,f[110],cnt;
ll fd(ll x)
{
    if(f[x]!=x)
    {
        f[x]=fd(f[x]);
    }
    return f[x];
}
ll Union(ll a,ll b)
{
    ll p1=fd(a);
    ll p2=fd(b);
    if(p1!=p2)
    {
        f[p2]=p1;
        return 1;
    }
    return 0;
}
bool cmp(node p1,node p2)
{
    return p1.w<p2.w;
}
int main()
{
    ll x,y,z;
    while(~scanf("%lld%lld%lld",&c,&m,&n))
    {
        cnt=0;
        for(ll i=1;i<=m;i++)
        {
            scanf("%lld%lld%lld",&x,&y,&z);
            edge[++cnt].u=x;
            edge[cnt].v=y;
            edge[cnt].w=z;
            edge[++cnt].u=y;
            edge[cnt].v=x;
            edge[cnt].w=z;
        }
        sort(edge+1,edge+cnt+1,cmp);
        for(ll i=1;i<=n;i++)f[i]=i;
        ll ans=0,k=0;
        for(ll i=1;i<=cnt;i++)
        {

            if(Union(edge[i].u,edge[i].v))
            {
                ans+=edge[i].w;
                k++;
                if(k==n-1)break;
            }
        }
        if(ans<=c)printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}

    原文作者:道路修建问题
    原文地址: https://blog.csdn.net/s540239976/article/details/79312237
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞