洛谷 P1536 村村通
思路:并查集,设数组,初始每个集合是独立的,数组的值等于它的下标,然后每次合并将一个编号的值全部让另一个编号覆盖,然后最后输出编号的总数-1。
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,xa,xb,x,y,i,ans,a[2000];
int find(int s){
int r=s;
while(r!=a[r])r=a[r];
while(s!=r){
int t=s;
s=a[s];
a[t]=r;
}
return r;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
while(cin>>n>>m){
ans=0;
for(i=1;i<=n;i++)
a[i]=i;
for(i=1;i<=m;i++){
cin>>x>>y;
xa=find(x);
xb=find(y);
if(xa!=xb)
a[xb]=xa;
}
for(i=1;i<=n;i++)
if(a[i]==i)
ans++;
cout<<ans-1<<endl;
}
return 0;
}