PAT L3 003 社交集群 並查集

2021-09-11 11:07:35 字數 1301 閱讀 9809

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

題解:這道題既然是劃分群體,必然是用並查集來解。不過稍微有點特殊的是,乙個群體內並不一定都有乙個共同的愛好,比如說樣例中人數為3的那個群體,只要乙個人與團體中另乙個人有相同的愛好就行。那麼我們用interset[i]記錄喜歡愛好i的第乙個人,後面的人同樣喜歡這個愛好的與interset[i]合併即可,即union(i,interest[x])。最後用cnt[find(i)]統計群體人數即可。

**:

#includeusing namespace std;

const int maxn=1010;

int par[maxn];

int interest[maxn];

int cnt[maxn];

bool cmp(int x,int y)

void init()

int find(int x)

void union(int x,int y)

bool same(int x,int y)

int main()

} for(int i=1;i<=n;i++)

sort(cnt,cnt+maxn,cmp);

int num=0;

for(int i=0;iprintf("%d\n",num);

printf("%d",cnt[0]);

for(int i=1;iprintf(" %d",cnt[i]);

return 0;

}

L3 003 社交集群 並查集

時間限制 1000 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 在社交網路平台註冊時,使用者通常會輸入自己的興趣愛好,以便找到和自己興趣相投的朋友。有部分興趣相同的人們就形成了 社交集群 現請你編寫程式,找出所有的集群。輸入格式 輸入的第一行給...

L3 003 社交集群(並查集)

時間限制 1000 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 在社交網路平台註冊時,使用者通常會輸入自己的興趣愛好,以便找到和自己興趣相投的朋友。有部分興趣相同的人們就形成了 社交集群 現請你編寫程式,找出所有的集群。輸入格式 輸入的第一行給...

GPTL L3 003 社交集群(並查集)

資料有些弱,union函式不判不等也可以過。依次給出 n 個人的興趣,不同人興趣相交 不同興趣所屬人員相交均屬於同一集群,求形成的不相交集群個數及每個集群的人數。列舉每個興趣的人員,以序號最小者作為集群代表與其他成員合併,追加 cnt 陣列記錄每個集群的人數。如題目輸入 12 3456 78910 ...