题目大意:Ignatius 的生日这天来了很多朋友,到了吃饭的时候朋友们做的桌子上必须认识的朋友才坐一桌, 不认识的另开一桌,
问至少需要多少张桌子。
我的解法: 使用并查集合并认识的朋友,他们认识的坐一桌,初始化是每个人都不认识别人;
合并完成之后就是看看还有 ”哪些人认识的还是自己“ ( fa[i]==i ) 因为不等于的都是有朋友的,所以他和他的朋友坐一桌,
所以等于的桌子数就++;
代码:
#include<stdio.h>
#include<iostream>
using namespace std;
#define maxn 1105
int f[maxn], l[maxn];
int find(int x)
{
return x-f[x] ? f[x]=find(f[x]) : x ;
}
void merge(int u, int v)
{
int pu=find(u);
int pv=find(v);
if(pu!=pv)
{
f[pv]=pu;
}
}
int main()
{
int n,m,u,v,t, ans=0;
scanf("%d", &t);
while( t-- )
{
ans=0;
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++)
{
f[i]=l[i]=i;
}
while( m-- )
{
scanf("%d%d", &u, &v);
if( u>v )
{
int t=u; u=v; v=t;
}
merge(u, v);
}
for(int i=1; i<=n; i++)
if( f[i]==i )
ans++;
cout<<ans<<endl;
}
return 0;
}