一道并查集题,找出连通块个数,并用连通块数减一即得最小添加边数。
using namespace std;
const int mm=1e5+5;
int n,m,a,b,p[mm],ans;
int find(int x){//找祖宗节点
if(p[x]==x) return x;
return p[x]=find(p[x]);
}
int main(){
cin>>n>>m;
for(int i=0;i<=n;i++) p[i]=i;//初始化每个节点的根节点即本身
while(m--){
cin>>a>>b;
if(find(a)!=find(b))////if语句如果不加上就判错?
p[find(a)]=p[b];
}
for(int i=1;i<=n;i++){
if(p[i]==i) ans++;
}
cout<<ans-1<<en