题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805361586847744
并查集的基本应用,有几个地方是模版务必记一下
- find_father()函数
- Union()函数
- 初始化函数init()也可以直接写在主函数里
- 50到58行的代码
代码
#include<cstdio>#include<iostream>#include<algorithm>using namespace std;const int maxn = 1010;int m, n;int father[maxn];int is_root[maxn] = {0};int course[maxn];int find_father(int i){if(father[i] == i) return i;else{int f = find_father(father[i]);father[i] = f;return f;}}void Union(int a, int b){int faA = find_father(a);int faB = find_father(b);if(faA!=faB) father[faA] = faB;}void init(){for(int i = 1; i <= n; i++){father[i] = i;is_root[i] = false;}}bool cmp(int a, int b){return a > b;}int main(){int temp;scanf("%d", &n);init();for(int i = 1; i <= n; i++){scanf("%d:", &m);for(int j = 0; j < m; j++){scanf("%d", &temp);if(course[temp] == 0) course[temp] = i;Union(i, find_father(course[temp]));}}for(int i = 1; i <= n; i++){is_root[find_father(i)]++;}int count = 0;for(int i = 1; i <= n; i++){if(is_root[i] != 0){count++;}}printf("%d\n", count);sort(is_root + 1, is_root + n + 1, cmp);for(int i = 1; i <= count; i++){printf("%d", is_root[i]);if(i != count) printf(" ");}return 0;}
