您的位置:首页 > 其它

[Codeforces] 277A - Learning Languages

2014-08-05 13:41 85 查看
题意:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM codeforces