#include <stdio.h>
#include <string.h>
struct node
{
int data;
int rank;
int parent;
};
node Tree[1003];
void Make_set(int n)
{
int i;
for(i=1;i<=n;i++)
{
Tree[i].data = i;
Tree[i].parent = i;
Tree[i].rank = 0;
}
}
int Find_set(int x)
{
if(x!=Tree[x].parent)
{
x=Find_set(Tree[x].parent);
}
return x;
}
void Union_set(int x,int y)
{
x = Find_set(x);
y = Find_set(y);
if(Tree[x].rank>Tree[y].rank)
{
Tree[y].parent = x;
}
else
{
Tree[x].parent = y;
if(Tree[x].rank==Tree[y].rank)
{
Tree[y].rank++;
}
}
}
int main()
{
int n,m,x,y,i;
int c;
int parents[1003];
while (1)
{
memset(parents,0,sizeof(parents));
scanf("%d",&n);
if(n==0)
break;
c=0;
scanf("%d",&m);
Make_set(n);
for(i=1;i<=m;i++)
{
scanf("%d %d",&x,&y);
Union_set(x,y);
}
for (i=1;i<=n;i++)
{
parents[Find_set(i)] = 1;
}
for (i=1;i<=n;i++)
{
if(parents[i]!=0)
{
c++;
}
}
c = c>0?(c-1):c;
printf("%d\n",c);
}
return 0;
}
hdu oj 1232 并查集
最新推荐文章于 2021-05-05 19:30:07 发布