问题描述:
给n个人分配桌子,要求在一个桌子上只能有认识的人,然后给出了m中关系,求需要多少张桌子;
并查集:假设刚开始需要cnt=n张桌子,没合并一次,cnt减一,最后cnt的值就是答案;
初始化+查找+合并;
#include<iostream>
using namespace std;
const int maxn=1010;
int T;
int n,m,cnt;
int maze[maxn];
void init()
{
for(int i=0;i<maxn;i++)
maze[i]=i;
}
int my_find(int x)
{
return x==maze[x]? x : my_find(maze[x]);
}
void my_union(int i,int j)
{
int x=my_find(i);
int y=my_find(j);
if(x!=y)
{
maze[x]=y;
cnt--;
}
}
int main()
{
cin>>T;
int p,q;
while(T--)
{
init();
cin>>n>>m;
cnt=n;
for(int i=0;i<m;i++)
{
cin>>p>>q;
my_union(p,q);
}
cout<<cnt<<endl;
}
return 0;
}