[Codeforces] 277A - Learning Languages

本文介绍了一个使用并查集算法解决的沟通成本最小化问题。在一个公司中,每位员工掌握不同数量的语言,目标是确保所有员工能够通过直接或间接的方式进行交流,同时最小化学习新语言所需的总成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

n个职员各会Ki门语言,Ki可以为0。

现在需要让每个职员可以间接地与其他任意职员沟通,每个员工学一门语言需要花费1。问公司最少需要花多少钱。

举个例子,如果职员A会1,2两种语言,职员B会2,3两种语言,那么职员A就也会3这门语言,因为可以由B间接帮助A翻译。

用并查集可做,我们知道Ki为0的一定需要学一门语言,把每个职员自己会的语言并起来。最后判断有几棵树+Ki为0的个数即是所求。


#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <set>
#include <map>
#include <queue>
#include <stack>
using namespace std;
int a[1000], flag[101];
int find(int x)
{
    if(x != a[x])
    {
        a[x] = find(a[x]);
    }
    return a[x];
}
void union_set(int x, int y)
{
    x = find(x);
    y = find(y);
    if(x != y)
    {
        a[x] = y;
    }
}
void init(int m)
{
    for(int i = 0; i <= m; i++)
    {
        a[i] = i;
    }
    memset(flag, 0, sizeof(flag));
}
int main()
{
    int n, m, ans;
    while(~scanf("%d %d", &n, &m))
    {
        ans = 0;
        init(m);
        for(int i = 0; i < n; i++)
        {
            int k;
            scanf("%d", &k);
            if(!k)
            {
                ++ans;
            }
            else
            {
                int temp;
                int kk;
                scanf("%d", &kk);
                flag[kk] = 1;
                for(int j = 1; j < k; j++)
                {
                    scanf("%d", &temp);
                    flag[temp] = 1;
                    union_set(kk, temp);
                }
            }
        }
        int tmp = 0;
        for(int i = 1; i <= m; i++)
        {
            if(flag[i] && a[i] == i)
            {
                ++tmp;
            }
        }
        if(tmp > 1)
            ans += tmp - 1;
        printf("%d\n", ans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值