这是一道简单的并查集的题目,跟UVA 10608 Friends 差不多。
对于统计桌子的数目,我用了两种方法:
1、先将桌子数目初始化为n,然后合并一次就减一张。
<span style="font-size:14px;">#include<stdio.h>
int fa[1001];
int find(int u)
{
fa[u]==u?u:fa[u]=find(fa[u]);
return fa[u];
}
int main()
{
int i,n,m,t,x,y,u,v,k;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
k=n;
for (i=1;i<=n;i++) fa[i]=i;
for (i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
x=find(u);y=find(v);
if (x!=y) {fa[x]=y;k--;}
}
printf("%d\n",k);
}
return 0;
}</span>
2、先将朋友们分好组,在统计 fa[i]=i 的这些根节点有多少即为所求的桌子数。
#include<stdio.h>
int fa[1001];
int find(int u)
{
fa[u]==u?u:fa[u]=find(fa[u]);
return fa[u];
}
int main()
{
int i,n,m,t,x,y,u,v,k;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) fa[i]=i;
while (m--)
{
scanf("%d%d",&u,&v);
x=find(u);y=find(v);
if (x!=y) fa[x]=y;
}
k=0;
for(i=1;i<=n;i++)
if (find(i)==i) k++;
printf("%d\n",k);
}
return 0;
}