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 91 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: 1Case 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; }
相关文章推荐
- poj 2524 Ubiquitous Religions(简单并查集)
- POJ 2524 Ubiquitous Religions (简单并查集,三种方式)
- POJ 2524 Ubiquitous Religions(简单的并查集题目)
- POJ2524 Ubiquitous Religions(简单并查集)
- POJ 2524 Ubiquitous Religions (最简单的并查集)
- POJ 2524 (简单并查集) Ubiquitous Religions
- poj 2524 Ubiquitous Religions 一简单并查集
- POJ 2524 Ubiquitous Religions(简单的并查集)
- POJ - 2524 Ubiquitous Religions(简单并查集)
- Poj 2524 Ubiquitous Religions[简单并查集]
- poj 2524 Ubiquitous Religions(最简单的并查集)
- Ubiquitous Religions(简单并查集 poj 2524 )
- POJ---2524 Ubiquitous Religions[简单并查集]
- POJ2524 Ubiquitous Religions (并查集)
- poj 2524(并查集)
- poj 2524 并查集 入门
- POJ 2492 A Bug's Life【并查集的简单应用同类的判断】
- poj 2524 Ubiquitous Religions(并查集)
- POJ 2524: Ubiquitous Religions - 并查集 |裸
- poj 2524 Ubiquitous Religions(并查集)