您的位置:首页 > 产品设计 > UI/UE

POJ 2524 Ubiquitous Religions(简单并查集)

2017-07-20 09:11 465 查看

Description

已知有n个大学生,其中有m对宗教信仰相同的学生,请你估算这n个学生中最多有多少种宗教信仰

Input

第一行为两个整数n和m表示大学生人数和有相同信仰的学生对数,之后m行每行两个整数a和b表示学生a和学生b有相同的宗教信仰(0 < n <= 50000,0<=m<=n*(n-1)/2)

Output

输出这n名学生最多有多少种宗教信仰

Sample Input

10 9

1 2

1 3

1 4

1 5

1 6

1 7

1 8

1 9

1 10

10 4

2 3

4 5

4 8

5 8

0 0

Sample Output

Case 1: 1

Case 2: 7

Solution

并查集,初始状态每个人都是一个集合,每次合并具有相同信仰的两人所处的集合,最后记录有多少不同的集合即可

#include <iostream>
#include <cstdio>
#include <map>

using namespace std;

int pre[50010] = {0};

int find(int x)
{
if (pre[x] == x)
{
return x;
}
return pre[x] = find(pre[x]);
}

void join_root(int i, int j)
{
int i_root = find(i);
int j_root = find(j);
if (i_root != j_root)
{
pre[j_root] = i_root;
}
}

void init(int id_sum)
{
for (int i = 1; i <= id_sum; i++)
{
pre[i] = i;
}
}

int main()
{
int id_sum, lines, t = 1;
while (scanf("%d%d", &id_sum, &lines) && (id_sum || lines))
{
init(id_sum);
while (lines--)
{
int stu1, stu2;
cin >> stu1 >> stu2;
join_root(stu1, stu2);
}
map<int, int> m;
for (int i = 1; i <= id_sum; i++)
{
int i_root = find(i);
m[i_root]++;
}
map<int, int>::iterator it;
int ans = m.size();
printf("Case %d: %d\n", t++, ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: