/*
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
最新推荐文章于 2021-12-07 22:09:42 发布
本文通过一个具体的并查集算法实现案例,详细介绍了并查集的基本概念、核心函数的实现方式,包括查找(find)和合并(merge)操作,并提供了一个完整的C语言程序示例来解决特定问题。
1317

被折叠的 条评论
为什么被折叠?



