L3 003 社交集群

2021-08-22 14:51:37 字數 1592 閱讀 9671

l3-003 社交集群

當你在社交網路平台註冊時,一般總是被要求填寫你的個人興趣愛好,以便找到具有相同興趣愛好的潛在的朋友。乙個「社交集群」是指部分興趣愛好相同的人的集合。你需要找出所有的社交集群。

輸入格式:

輸入在第一行給出乙個正整數 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

解題思路:

雖然知道是用並查集,但是不知道怎麼根據興趣愛好找到同一圈子的人。參考了柳神,用course[t]記錄喜歡t的人,findfather(course[t])表示喜歡t的人所屬社交圈的根節點,用isroot[findfather(i)]++統計每個社交圈人數,不為零的個數,表示社交圈個數,具體的值表示每個社交圈內的人數。

#include

#include

#include

using

namespace

std;

const

int maxn=1010;

int father[maxn],isroot[maxn];

bool cmp(int a,int b)

int findfather(int x)

return x;

}void union(int a,int b)

int main(); //course[t]記錄喜歡t的人的編號

for(int i=0;iscanf("%d",&n);

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

union(i,findfather(course[x])); //想不到 }}

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

isroot[findfather(i)]++; //同一社交圈的人數

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

printf("%d\n",cnt);

sort(isroot,isroot+maxn,cmp);

for(int i=0;iprintf("%d",isroot[i]);

if(i1) printf(" ");

}return

0;}

L3 003 社交集群

在社交網路平台註冊時,使用者通常會輸入自己的興趣愛好,以便找到和自己興趣相投的朋友。有部分興趣相同的人們就形成了 社交集群 現請你編寫程式,找出所有的集群。輸入格式 輸入的第一行給出正整數n 1000 即社交網路中的使用者總數 則使用者從1到n編號 隨後n行,每行按下列格式列出每個人的興趣愛好 ki...

L3 003 社交集群

在社交網路平台註冊時,使用者通常會輸入自己的興趣愛好,以便找到和自己興趣相投的朋友。有部分興趣相同的人們就形成了 社交集群 現請你編寫程式,找出所有的集群。輸入格式 輸入的第一行給出正整數n 1000 即社交網路中的使用者總數 則使用者從1到n編號 隨後n行,每行按下列格式列出每個人的興趣愛好 ki...

L3 003 社交集群

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