7-7 社交集群 (30 分) (集合数组的方法)
生活随笔
收集整理的這篇文章主要介紹了
7-7 社交集群 (30 分) (集合数组的方法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
當你在社交網絡平臺注冊時,一般總是被要求填寫你的個人興趣愛好,以便找到具有相同興趣愛好的潛在的朋友。一個“社交集群”是指部分興趣愛好相同的人的集合。你需要找出所有的社交集群。
能搜這道題的差不多都一樣,就不把題目照搬了
這道題我的想法是: 每個人都有一個集合,裝著,自己的興趣愛好,如果與其他人的興趣集合(set的一個方法)有交集,就把他們連接起來(并查集),最后統計圈子的個數和里面人數的數量,找了半天也沒看到有和自己想法相同的,就自己發出來看看(詳細點的注釋在代碼上)
#include <bits/stdc++.h> using namespace std;set<int> id[1010]; //每個人的興趣集合 int fa[1010]; //并查集 int cnt[1010]; //統計圈子數量void init(int n) {for (int i = 1 ; i <= n ; i++) fa[i] = i; }int find(int x) {return x == fa[x] ? x : (fa[x] = find(fa[x])); }void merge(int x, int y) {fa[find(x)] = find(y); }int main() {int n;cin >> n;init(n);int k,h;scanf("%d: ", &k);while (k-- ) {cin >> h;id[1].insert(h);}for (int i = 2 ; i <= n ; i++) {int k,h;set<int> st; //下面用來判斷兩個集合有沒有交集scanf("%d: ",&k);while (k--) {cin >> h;id[i].insert(h);}for (int j = 1 ; j < i ; j++) {set_intersection(id[j].begin(),id[j].end(),id[i].begin(),id[i].end(),inserter(st,st.begin()));if (st.size()) merge(j,i);st.clear(); //重置}}//后面有點冗長,不過也沒想其他方法優化了for (int i = 1 ; i <= n ; i++) {cnt[find(i)]++; //計數}sort(cnt+1,cnt+n+1,greater<int>());int num =0; for (int i = 1 ; i <= n ; i++) {if (cnt[i]) num++;}cout << num<<endl;int flag = 0;for (int i = 1 ; i <= n ; i++) {if (cnt[i]) {if (!flag) {cout << cnt[i];flag = 1;} else cout << " " <<cnt[i];}} }學習愉快!!!
總結
以上是生活随笔為你收集整理的7-7 社交集群 (30 分) (集合数组的方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webrtc 的回声抵消(aec、aec
- 下一篇: css 弹性盒子