<-------------这是我做的第一个并查集的题,很简单,超简单。。(也是我写的第一个博客哈哈)------------------------->
#include <iostream>
#include <string>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int n,f[1000]={0},m,sum=0;
void init() //初始化函数
{ for(int i=1;i<=n;i++)
f[i]=i; return ;
}
int getf(int v) //寻找头目
{ if(f[v]==v)
{ return v; }
else{ f[v]=getf(f[v]); return f[v]; }
}
void merge(int v,int u) //靠左原则归并
{ int t1,t2;
t1=getf(v);
t2=getf(u);
if(t1!=t2)
{ f[t2]=t1; }
return ; }
int main()
{ int i,x,y; scanf("%d",&n);
if(n==0) return 0;
scanf("%d",&m);
while( n!=0 )
{init();
for(i=1;i<=m;i++)
{ scanf("%d %d",&x,&y);
merge(x,y); }
for(i=1;i<=n;i++)
{ if(f[i]==i) sum++; }
printf("%d\n",sum-1);
sum=0;
scanf("%d",&n);
if(n==0) return 0;
scanf("%d",&m); }
}

浙公网安备 33010602011771号