代码实现
#include <cstdio>
#include <unordered_set>
using namespace std;
const int maxn = 1010;
int father[maxn];
int n;
int m;
int find(int x){
if(father[x]==x){
return x;
}else{
int F = find(father[x]);
father[x] = F;
return F;
}
}
void Union(int u,int v){
int fatherU = find(u);
int fatherV = find(v);
if(fatherU != fatherV){
father[fatherU] = fatherV;
}
return;
}
int main(){
while(scanf("%d",&n)!=EOF&&n!=0){
scanf("%d",&m);
for(int i=1;i<=n;i++){
father[i] = i;
}
for(int i=0;i<m;i++){
int u,v;
scanf("%d %d",&u,&v);
Union(u,v);
}
unordered_set<int> st;
for(int i=1;i<=n;i++){
st.insert(find(i));
}
printf("%d\n",st.size()-1);
}
return 0;
}
码后反思
- 简单题,其实也可以使用DFS来解题。。。
- 就是并查集操作的三个套路,初始化,找爸爸再加合并爸爸。