7-13 部落 (25 分)
生活随笔
收集整理的這篇文章主要介紹了
7-13 部落 (25 分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在一個社區里,每個人都有自己的小圈子,還可能同時屬于很多不同的朋友圈。我們認為朋友的朋友都算在一個部落里,于是要請你統計一下,在一個給定社區中,到底有多少個互不相交的部落?并且檢查任意兩個人是否屬于同一個部落。
輸入格式:
輸入在第一行給出一個正整數N(≤10
?4
?? ),是已知小圈子的個數。隨后N行,每行按下列格式給出一個小圈子里的人:
K P[1] P[2] ? P[K]
其中K是小圈子里的人數,P[i](i=1,?,K)是小圈子里每個人的編號。這里所有人的編號從1開始連續編號,最大編號不會超過10
?4
?? 。
之后一行給出一個非負整數Q(≤10
?4
?? ),是查詢次數。隨后Q行,每行給出一對被查詢的人的編號。
輸出格式:
首先在一行中輸出這個社區的總人數、以及互不相交的部落的個數。隨后對每一次查詢,如果他們屬于同一個部落,則在一行中輸出Y,否則輸出N。
很明顯這個是并查集,我用C和C++都寫了一遍。因為我C++用了set,這在C語言里是沒有的。
C++實現:
C語言實現:
//C語言實現7-13 部落 (25 分) #include <stdio.h> #include <stdbool.h> int t, f[100001]; int find(int x) {int num = x;while (num != f[num]){num = f[num];}while (x != f[x]){int z = x;x = f[x];f[z] = num;}return num; } int main() {bool pan[100001] = {false}; //判斷是否有這個人bool pan1[100001] = {false}; //判斷有幾個部落int ch[100001]; //存儲數字;for (int i = 0; i <= 10000; i++){f[i] = i;}int t, cou = 0;scanf("%d", &t);while (t--){int n, father, num;scanf("%d", &n);for (int i = 0; i < n; i++){scanf("%d", &num);if (i == 0)father = num;else{f[find(num)] = father;}if (pan[num] == false){pan[num] = true;ch[cou++] = num;}}}int cou1 = 0;for (int i = 0; i < cou; i++){int x = find(ch[i]);if (pan1[x] == false){pan1[x] = true;cou1++;}}printf("%d %d\n", cou, cou1);scanf("%d", &t);while (t--){int a, b;scanf("%d %d", &a, &b);if (find(a) == find(b))printf("Y\n");elseprintf("N\n");}return 0; } 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的7-13 部落 (25 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 导出qq群成员信息,并找出谁没进群或谁没
- 下一篇: GOF设计模式--简单工厂模式