l3-003 社交集群 (30 分)
當你在社交網路平台註冊時,一般總是被要求填寫你的個人興趣愛好,以便找到具有相同興趣愛好的潛在的朋友。乙個「社交集群」是指部分興趣愛好相同的人的集合。你需要找出所有的社交集群。
輸入在第一行給出乙個正整數 n(≤1000),為社交網路平台註冊的所有使用者的人數。於是這些人從 1 到 n 編號。隨後 n 行,每行按以下格式給出乙個人的興趣愛好列表:
ki: hi[1] hi[2] ... hi[ki]
其中ki(>0)是興趣愛好的個數,hi[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 ...