极简单的水题,求集合个数-1即可。初始化cnt为n,,每当要合并的时候,就把cnt--。最后输出cnt-1。
AC代码:
#include<stdio.h>
#define NUM 1005
int set[NUM];
int n;
void init()
{
for(int i=0;i<=n;i++){
set[i]=i;
}
}
int find(int x)
{
int r=x;
while(r!=set[r])
r=set[r];
return r;
}
void merge(int a, int b)
{
int x=find(a);
int y=find(b);
if(x!=y)
set[y]=x;
}
int main()
{
int m,i,j,cnt;
//freopen("C:\\Documents and Settings\\Administrator\\桌面\\input.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF&&n!=0){
init();
cnt=n;
while(m--){
scanf("%d%d",&i,&j);
if(find(i)!=find(j)){
merge(i,j);
cnt--;
}
}
printf("%d\n",cnt-1);
}
return 0;
}