27行代码AC_How Many Tables HDU - 1213(并查集讲解)

励志用少的代码做高效表达


分析与思路

n个人吃饭,只能熟人和熟人坐在一起,否则就一个人坐一桌。 给定m个关系(m对熟人),问最少需要多少张桌子。

纯粹考查的并查集模板的题, 给定m个关系就代表了m个集合, 将有相同元素的集合和并, 最后计算集合的个数即可。

视频讲解——>传送门


这里分享一下我学习新算法的方法:

  1. 通过观看视频或文档(最好是视频)理解基础的原理
  2. 尝试理解代码
  3. 手写代码,一面回想原理一面默写。 一般默写一到两遍就记牢了(千万不要只用电脑敲,忘得超快。 好记性不如烂笔头)。
  4. 不停的刷类型题, 一般刷完8-10道题,就可以比较熟练的运用这一类算法。

#include<bits/stdc++.h>
using namespace std;
int per[1010];

int find(int x) {
    
    
	if(x==per[x]) return x;
	per[x] = find(per[x]);
	
	return per[x];
}

void Union(int a, int b) {
    
    				//建立并集 
	int t1 = find(a);
	int t2 = find(b);
	if(t1 != t2) per[t1] = t2;
}

int main() {
    
    
	ios::sync_with_stdio(false);
	int T; cin>>T; while(T--) {
    
    
		int n, m; cin>>n>>m;
		
		for(int i = 1; i <= n; i++) per[i] = i;  
		
		while(m--) {
    
    
			int a, b; cin>>a>>b;
			Union(a, b);			//对所有序对建立并 
		} 
		
		int ans = n;
		
		for(int i = 1; i <= n; i++) if(per[i] != i) ans--;
		
		cout << ans << endl;
	}
return 0; } 

如果这篇文章对你产生了帮助,就请给博主一个赞吧!让更多的人看到它。

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/108669922
今日推荐