前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C - Roads and Libraries HackerRank - torque-and-development 【 并查集 】

C - Roads and Libraries HackerRank - torque-and-development 【 并查集 】

作者头像
Lokinli
发布2023-03-09 15:29:34
2060
发布2023-03-09 15:29:34
举报
文章被收录于专栏:以终为始以终为始

C - Roads and Libraries

HackerRank - torque-and-development 

题意:给一堆点与点之间有没有边,在某一些地方建图书馆,最后让每个城市都可以到达有图书馆的地方,每个点都可以建图书馆,也可以不建,在两个点之间建一条路,这样在任意一个点建一个图书馆就可以了。现在图书馆和路的花费给出来,为了让所有的点都可以到达图书馆,找一个最小答案。 题解:用并查集合并一下,就可以了。判断一下是建一条路贵还是建图书馆贵。

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn =100005;
ll fa[maxn];
ll fin(ll x)
{
    return x == fa[x] ? x : fa[x] = fin(fa[x]);
}
void Un(ll x, ll y)
{
    ll a = fin(x);
    ll b = fin(y);
    if(a != b)
    {
        fa[a] = b;
    }
    return ;
}
int main()
{
    ll t,u,v;
    ll n,m,croad,clib;
    scanf("%lld", &t);
    while(t--)
    {
        scanf("%lld %lld %lld %lld", &n, &m, &clib, &croad);
        ll num = 0;
        num = n * clib;

        for(ll i = 1; i <= n; i ++) fa[i] = i;
        for(ll i = 0; i < m; i ++)
        {
            scanf("%lld %lld", &u, &v);
            Un(u,v);
        }
        if(clib <= croad)
        {
            printf("%lld\n",num);
        }
        else
        {
            ll sum = 0;
            for(ll i = 1; i <= n; i ++)
            {
                if(fa[i] == i) sum += clib;
                else sum += croad;
            }
            printf("%lld\n",sum);
        }
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-03-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • C - Roads and Libraries
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档