来让你开  

<-------------这是我做的第一个并查集的题,很简单,超简单。。(也是我写的第一个博客哈哈)------------------------->

#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); }

}

posted on 2018-06-05 20:56  来让你开  阅读(74)  评论(1)    收藏  举报