一道很简单的并查集入门题,唯一坑的是用路径压缩居然超时了。。。。没做优化也能过
#include <stdio.h>
int root[1010];
int Find(int x)
{
while(root[x] != x) //找到根节点
{
x = root[x];
}
return x;
}
int Union(int x, int y)
{
x = Find(x); //找x的根节点
y = Find(y); //找y的根节点
if(x != y)
{
root[x] = y; //将x的根节点设置为y,即进行合并操作
}
return 0;
}
int main()
{
int t, n, m;
int s1, s2;
while(scanf("%d", &t) != EOF)
{
while(t--)
{
int count = 0;
for(int i = 0; i < 1010; i++) //根节点初始化为自己
{
root[i] = i;
}
scanf("%d %d", &n, &m);
for(int i = 0; i < m; i++)
{
scanf("%d %d", &s1, &s2);
Union(s1, s2);
}
for(int i = 1; i <= n; i++)
{
if(root[i] == i) //如果根节点还是自己的话,证明就有几个集合
{
count++;
}
}
printf("%d\n", count);
}
}
return 0;
}