励志用少的代码做高效表达
分析与思路
n个人吃饭,只能熟人和熟人坐在一起,否则就一个人坐一桌。 给定m个关系(m对熟人),问最少需要多少张桌子。
纯粹考查的并查集模板的题, 给定m个关系就代表了m个集合, 将有相同元素的集合和并, 最后计算集合的个数即可。
视频讲解——>传送门
这里分享一下我学习新算法的方法:
- 通过观看视频或文档(最好是视频)理解基础的原理
- 尝试理解代码
- 手写代码,一面回想原理一面默写。 一般默写一到两遍就记牢了(千万不要只用电脑敲,忘得超快。 好记性不如烂笔头)。
- 不停的刷类型题, 一般刷完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; }