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 作者 陳越 在社交網路平台註冊時,使用者通常會輸入自己的興趣愛好,以便找到和自己興趣相投的朋友。有部分興趣相同的人們就形成了 社交集群 現請你編寫程式,找出所有的集群。...