一直以为这题要用最小生成树做,弄来弄去没弄出来,后来才知道用并查集就可以了
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
int n,m,fa[1005];
int find(int p){
if(fa[p]!=p)
fa[p]=find(fa[p]);
return fa[p];
}
void unionset(int p,int q){
fa[q]=p;
}
int main(){
while(scanf("%d",&n)!=EOF){
if(n==0)break;
for(int i=1;i<=1000;i++){
fa[i]=i;
}
scanf("%d",&m);
for(int i=0;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
int a=find(u);
int b=find(v);
if(a!=b){
n--;
fa[b]=a;
}
}
printf("%d\n",n-1);
}
return 0;
}