洛谷 P1536 村村通

洛谷 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;
}

猜你喜欢

转载自blog.csdn.net/weixin_52536621/article/details/113953113
今日推荐