How Many Tables
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 79480 Accepted Submission(s): 40418
题目大意
有一个人过生日,请到了他的诸多朋友,但是这些朋友之间有的认识,有的不认识。这个人想尽可能的把相互之间认识的人凑到一张桌子上,不认识的人则去另一张桌子。朋友们互相认识的规则是:比如A认识B,B认识C,那么A,B,C就可以凑到一桌子上。现在问:他的朋友们以这样的规则能凑够几桌。
解题思路
并查集模板题,运用并查集即可,以下给出一个并查集最简单的例子
#include <iostream>
using namespace std;
const int N = 1050;
int s[N];
void init_set() {
for (int i = 0; i < N; i++)s[i] = i; //初始化集合
}
int find_set(int x) {
return x == s[x] ? x : find_set(s[x]); //查找
}
void merge_set(int x, int y) {
x = find_set(x); y = find_set(y); //合并
if (x != y) s[x] = s[y]; //x合并到y上
}
int main() {
int t, n, m, x, y; cin >> t;
while (t--) {
cin >> n >> m;
init_set();
for (int i = 1; i <= m; i++) {
cin >> x >> y;
merge_set(x, y);
}
int ans = 0;
for (int i = 1; i <= n; i++)
if (s[i] = i)ans++; //统计集合数
cout << ans << endl;
}
}