您的位置:首页 > 其它

CodeForces 277A Learning Languages (并查集)

2017-08-28 09:26 477 查看
题目:CodeForces 277A Learning Languages (并查集)

题意:有n个人,m种语言,给出每个人会的语言数(可以为0)及种类,求任意两个人都能互相沟通(直接或间接都可以),至少还要继续学习的语言数。

思路:并查集

如:题目给出的例子,8个人,7种语言。1号会0种语言,2号会1,2,3号语言。。。。。。。。

8 7
0
3 1 2 3
1 1
2 5 4
2 6 7
1 3
2 7 4
1 1


将每种语言看作一个叶子结点。



读取一号数据后,结点不变(因为一号什么也不会)

继续读取二号数据



三号,四号



五号,六号



七号,八号



然后,将图中的森林,变成一颗树,所要添上的边的数量就是要继续学习的语言数

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<math.h>
#include<vector>
#include<string>
#include<map>
#include<queue>
#include<algorithm>
#include<string.h>
using namespace std;
/*
并查集test
*/
int lang[108];
int lang_check[108];

int diedai(int a)
{
if (a==lang_check[a])
{
return a;
}
else
{
return diedai(lang_check[a]);
}
}

void my_find(int flag,int v2)
{
int f1 = diedai(flag);
int f2 = diedai(v2);
if (f1!=f2)
{
lang_check[f2] = lang_check[f1];
}
}

int main()
{
int my_result = 0;
int man_sum, lang_sum;
for (int i = 0; i < 108; i++)
{
lang_check[i] = i;
}
cin >> man_sum >> lang_sum;
for (int i = 0; i < man_sum; i++)
{
int temp1;
cin
4000
>> temp1;
if (temp1==0)
{
my_result++;
continue;
}
else
{
int flag;
cin >> flag;
lang[flag] = 1;
for (int j = 1; j < temp1; j++)
{
int temp2;
cin >> temp2;
lang[temp2] = 1;
my_find(flag, temp2);
}
}

}
int flag2 = 0;
for (int i = 1; i <= lang_sum; i++)
{
if (lang[i]==0)
{
my_result--;
flag2++;
}
if (lang_check[i]==i)
{
my_result++;
}
}
if (flag2==lang_sum)
{
cout << man_sum << endl;
}
else
{
cout << my_result - 1 << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: