题意:有n个人,若两个人直接或间接认识,则可以坐一个桌子,求这些人需要的最少桌子数
思路:把认识的人并在一起,查一共有多少个不同的集合即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1005;
int n, m, T, u[maxn], vis[maxn];
int ufind(int x)
{
if (u[x] != x)
u[x] = ufind(u[x]);
return u[x];
}
void unite(int x, int y)
{
u[ufind(x)] = ufind(y);
}
int main()
{
cin >> T;
for (int i = 0; i < T; i++) {
cin >> n >> m;
memset(vis, 0, sizeof(vis));
for (int j = 1; j <= n; j++)
u[j] = j;
for (int i = 1; i <= m; i++) {
int x, y;
cin >> x >> y;
unite(x, y);
}
int ans = 0;
for (int j = 1; j <= n; j++) {
if (!vis[ufind(j)]) {
vis[ufind(j)] = 1;
ans++;
}
}
cout << ans << endl;
}
return 0;
}