题意:有一群小朋友要吃饭,认识或者间接认识的人才可以做到一张桌子(每张桌子可以座无限多的人)上,输入n个人和m组关系,问最少需要多少张桌子?
思路:并查集模板。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int n, m, f[MAXN];
void init()
{
for (int i = 0; i <= n; i++) f[i] = i;
}
int find(int x)
{
if (f[x] == x) return x;
f[x] = find(f[x]);
return f[x];
}
void Union(int a, int b)
{
int root1 = find(a), root2 = find(b);
f[root1] = root2;
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &n, &m);
init();
for (int i = 0; i < m; i++)
{
int a, b; scanf("%d%d", &a, &b);
Union(a, b);
}
int ans = 0;
for (int i = 1; i <= n; i++)
{
if (f[i] == i) ans++;
}
printf("%d\n", ans);
}
return 0;
}
/*
2
5 3
1 2
2 3
4 5
5 1
2 5
*/