hdu 1213 How many tables (适合新人入门贴)


今天是并查集专场哦,题意就不多解释了,看不懂的去补补英语吧ㄟ( ▔, ▔ )ㄏ,裸的并查集,首先初始化让每个点的根节点为他自己本身,若输入a,b认识那么就把a,b归入同一集合(也就是让a,b的根节点一样,并查集里用集合里某一个点作为根节点来代表这个集合,也叫做代表元),最后只要检测有几个代表元就可以知道最少要几个桌子了,还有一点就是路径压缩,我们每次找一点的根节点都要从他的父节点,爷爷节点啥的找过去多烦啊,如果这条路径很长查找起来就更烦啦,所以如果我们第一次查找的时候就把他路径上的每个点都直接连在根节点上就方便了。以下就是代码啦。

#include<bits/stdc++.h>

using namespace std;
int per[1005];

int sf(int x){
	int r=x;
   while(r!=per[r]){	
   r=per[r];
   }
   while(r!=x){
   	int t=per[x];
   	per[x]=r;
   	x=t;
   }
   return r;
}

void Union(int a,int b){
	if(sf(a)!=sf(b))
     per[sf(a)]=sf(b);
}


int main(){
	int t,n,m,i,sum,a,b;
	cin>>t;
	while(t--){
		cin>>n>>m;
		sum=0;
		for(i=1;i<=n;i++)
		per[i]=i;
		for(i=1;i<=m;i++){
			cin>>a>>b;
			Union(a,b);
		}
		for(i=1;i<=n;i++)
		if(per[i]==i)
		sum++;
		cout<<sum<<endl;
	}
	return 0;
}
各位看官们,适合入门么。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值