1.千万别忘记路径压缩:顺便把经历的父节点给变成根节点
2.道路=独立的-1
3.最后判断fa==i就是独立的
不用find一开始的初始化不就是这样的么
#include <bits/stdc++.h>
using namespace std;
int fa[10005];
int find(int x)
{if(fa[x]==x) return x;return fa[x]=find(fa[x]);//路径压缩
}
void merge(int x,int y)
{fa[find(x)]=find(y);
}
int main()
{int n,m;while(cin>>n){if(n==0) break;cin>>m; for(int i=1;i<=n;i++){fa[i]=i;}for(int i=0;i<m;i++){int uu,vv;cin>>uu>>vv;merge(uu,vv);}int ans=0;for(int i=1;i<=n;i++){if(fa[i]==i) ans++;}cout<<ans-1<<endl;//所有的独立集合-1 }
}