/*
http://acm.hdu.edu.cn/showproblem.php?pid=1213
并查集
*/
#include <stdio.h>
int table[1010];
int find(int x)
{
int p = table[x];
while(p!=x)
{
x = p;
p = table[x];
}
return p;
}
int len(int x)
{
int cnt=0;
int p = table[x];
while(p!=x)
{
x = p;
p = table[x];
cnt++;
}
return cnt;
}
void merge(int x, int y)
{
int px = find(x);
int py = find(y);
if(len(x) > len(y))
{
table[py]=px;
}
else
{
table[px]=py;
}
}
int main()
{
freopen("input.txt","r",stdin);
int cas;
scanf("%d",&cas);
while(cas--)
{
int n,m;
scanf("%d %d",&n,&m);
int i;
for(i=0; i<=1010; i++)
table[i]=i;
for(i=1; i<=m; i++)
{
int x,y;
scanf("%d %d",&x,&y);
merge(x,y);
}
int sum=0;
for(i=1; i<=n; i++)//将非根的节点置为0
{
if(table[i]==0) continue;
int p = table[i];
int j = i;
while(p!=j)
{
table[j]=0;
j = p;
p = table[j];
}
}
for(i=1; i<=n; i++)//有多少个非0节点即需要多少桌子
{
if(table[i]!=0)
sum++;
}
printf("%d\n",sum);
}
return 0;
}
HDU 1213 How Many Tables
最新推荐文章于 2020-10-25 10:37:37 发布