HDU - 1213 How Many Tables 并查集模版

题目链接

HDU-1213

题意

给定朋友关系,问最终有多少组朋友

思路

裸的并查集,最终跑一遍find函数看看有几个不同的组就可以了

代码

#include<iostream>  
#include<cmath>
#include<cstring>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
using namespace std;
	typedef long long ll;
	const int maxn=30500;
	const int inf=0x3f3f3f3f;
	int fa[maxn*3];
	int ra[maxn];
	bool bl[maxn];
	int n,m,k;
	void init(){
    
    
		for(int i=0;i<maxn;i++){
    
    
			fa[i]=i;
			ra[i]=0; 
		}
		return ;
	}
	
	int find(int x){
    
    
		return x==fa[x]?x:fa[x]=find(fa[x]);
	}
	
	void unite(int x,int y){
    
    
		x=find(x); y=find(y);
		if(x==y)
			return ;
		else if(ra[x]<ra[y]){
    
    
			fa[x]=y;
		} 
		else{
    
    
			fa[y]=x;
			if(ra[x]==ra[y])
				ra[x]++;
		}
	}
	
	int main(){
    
    
		IOS
		int tn;
		cin>>tn;
		while(tn--){
    
    
			memset(bl,0,sizeof(bl));
			init();
			cin>>n>>m;
			while(m--){
    
    
				int a,b;
				cin>>a>>b;
				unite(a,b);
			}
			int ans=0;
			for(int i=1;i<=n;i++)
				bl[find(i)]=1;
			for(int i=1;i<=n;i++)
				if(bl[i])
					ans++;
			cout<<ans<<endl;
		}
	}
	

猜你喜欢

转载自blog.csdn.net/TheSunspot/article/details/107765393