最小生成树,father[i]=i的anser++;
#include<iostream>
using namespace std;
#include<algorithm>
#include<cstring>
int height[1000010];
int father[1000010];
int answer;
int vis[1000010];
void init()
{
for(int i=0;i<1000010;i++)
{
father[i]=i;
height[i]=1;
}
}
int find(int x)
{
if(x!=father[x])
{
father[x]=find(father[x]);
// cout<<4;
}
return father[x];
}
void unionn(int x, int y)
{
x=find(x);
y=find(y);
if(x!=y)
{
if(height[x]>height[y])
{
father[y]=x;
}else if(height[x]<height[y])
father[x]=y;
else {
father[x]=y;
height[y]++;
}
}
// cout<<3;
}
int main()
{
init();
int m,n;
while(scanf("%d%d",&m,&n)!=EOF )
{
if(!m)
break;
vis[m]=1;
vis[n]=1;
if(find(m)!=find(n))
{
unionn(m, n);
// cout<<2;
}
}
for(int i=0;i<1000010;i++)
{
if(!vis[i])
continue;
if(find(i)==i)
{
answer++;
}
// cout<<4;
}
cout<<answer;
// cout<<3;
return 0;
}