C++学习之路 | PTA(天梯赛)—— L3-003 社交集群 (30分) (带注释) (并查集) (精简)
生活随笔
收集整理的這篇文章主要介紹了
C++学习之路 | PTA(天梯赛)—— L3-003 社交集群 (30分) (带注释) (并查集) (精简)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
L3-003 社交集群 (30分)
當你在社交網絡平臺注冊時,一般總是被要求填寫你的個人興趣愛好,以便找到具有相同興趣愛好的潛在的朋友。一個“社交集群”是指部分興趣愛好相同的人的集合。你需要找出所有的社交集群。
輸入格式:
輸入在第一行給出一個正整數 N(≤1000),為社交網絡平臺注冊的所有用戶的人數。于是這些人從 1 到 N 編號。隨后 N 行,每行按以下格式給出一個人的興趣愛好列表:
K
?i
?? : h
?i
?? [1] h
?i
?? [2] … h
?i
?? [K
?i
?? ]
其中K
?i
?? (>0)是興趣愛好的個數,h
?i
?? [j]是第j個興趣愛好的編號,為區間 [1, 1000] 內的整數。
輸出格式:
首先在一行中輸出不同的社交集群的個數。隨后第二行按非增序輸出每個集群中的人數。數字間以一個空格分隔,行末不得有多余空格。
輸入樣例:
8
3: 2 7 10
1: 4
2: 5 3
1: 4
1: 3
1: 4
4: 6 8 1 5
1: 4
輸出樣例:
3
4 3 1
本題使用并查集便可解決,思路很簡單,注意的是需要將愛好和人的編號分開
#include<iostream> #include<vector> #include<algorithm> using namespace std; const int maxn = 1002; int course[maxn]{ 0 };//存儲該興趣愛好的人編號 int pre[maxn]{ 0 }; vector<int>v(maxn);//存儲不同社交集群的人數 int find(int x)//并查集模板,查找 {while (x != pre[x]) x = pre[x];return x; } void merge(int a, int b)//并查集模板,合并 {int x = find(a);int y = find(b);if (x != y) pre[x] = y; } bool cmp(int a, int b)//自定義排序 {return a > b;//加條件回報段錯誤 } int main() {int n, k, value;//value存儲興趣愛好編號for (int i = 1; i < maxn; i++) pre[i] = i;//初始化pre數組cin >> n;for (int i = 1; i <= n; i++){cin >> k;getchar();for (int j = 0; j < k; j++){cin >> value;if (course[value] == 0) course[value] = i;//如果該興趣愛好還沒有劃分組,進行另它為i號人的興趣,course[value]=i;else merge(i, course[value]);//否則,將i和course[value]的人編號合并。}}int count = 0;//存儲集群數for (int i = 1; i <= n; i++){int fa = find(i);//查找老大if (v[fa] == 0) count++;//如果沒被訪問過(人員為0),集群數加一v[fa]++;//人員數加加}cout << count << endl;sort(v.begin()+1, v.end(), cmp);//降序int flag = 0;//第一個數不能是空格for (int i = 1; i <= count; i++){if (v[i] != 0){if (flag++ == 0)cout << v[i];else cout << " " << v[i];}}}總結
以上是生活随笔為你收集整理的C++学习之路 | PTA(天梯赛)—— L3-003 社交集群 (30分) (带注释) (并查集) (精简)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java求平均值Scanner_Scan
- 下一篇: linux文本处理脚本题,Linux文本