日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++学习之路 | PTA(天梯赛)—— L2-024 部落 (25分)(带注释)(并查集)(精简)

發(fā)布時(shí)間:2024/7/23 c/c++ 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++学习之路 | PTA(天梯赛)—— L2-024 部落 (25分)(带注释)(并查集)(精简) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

L2-024 部落 (25分)
在一個(gè)社區(qū)里,每個(gè)人都有自己的小圈子,還可能同時(shí)屬于很多不同的朋友圈。我們認(rèn)為朋友的朋友都算在一個(gè)部落里,于是要請(qǐng)你統(tǒng)計(jì)一下,在一個(gè)給定社區(qū)中,到底有多少個(gè)互不相交的部落?并且檢查任意兩個(gè)人是否屬于同一個(gè)部落。
輸入格式:

輸入在第一行給出一個(gè)正整數(shù)N(≤10
?4
?? ),是已知小圈子的個(gè)數(shù)。隨后N行,每行按下列格式給出一個(gè)小圈子里的人:
K P[1] P[2] ? P[K]
其中K是小圈子里的人數(shù),P[i](i=1,?,K)是小圈子里每個(gè)人的編號(hào)。這里所有人的編號(hào)從1開(kāi)始連續(xù)編號(hào),最大編號(hào)不會(huì)超過(guò)10
?4
?? 。
之后一行給出一個(gè)非負(fù)整數(shù)Q(≤10
?4
?? ),是查詢次數(shù)。隨后Q行,每行給出一對(duì)被查詢的人的編號(hào)。
輸出格式:

首先在一行中輸出這個(gè)社區(qū)的總?cè)藬?shù)、以及互不相交的部落的個(gè)數(shù)。隨后對(duì)每一次查詢,如果他們屬于同一個(gè)部落,則在一行中輸出Y,否則輸出N。
輸入樣例:

4
3 10 1 2
2 3 4
4 1 5 7 8
3 9 6 4
2
10 5
3 7
輸出樣例:

10 2
Y
N

#include<iostream> #include<set> using namespace std; const int maxn = 100000; int pre[maxn]; int find(int x)//并查集模板,查找 {while (x != pre[x]) x = pre[x];return x; } void merge(int a, int b)//并查集模板,合并 {int x = find(a);int y = find(b);if (x != y) pre[x] = y; } int main() {int n, x, number,number1;for (int i = 0; i <= maxn; i++) pre[i] = i;//初始化pre數(shù)組set<int>s;//存儲(chǔ)人的編號(hào),不重復(fù)cin >> n;for (int i = 0; i < n; i++){cin >> x;if (x > 0){cin >> number;s.insert(number);//將人員編號(hào)插入s,第一個(gè)人for (int j = 1; j < x; j++){cin >> number1;s.insert(number1);merge(number, number1);//合并}}}int vist[maxn]{ 0 };//標(biāo)記部落是否被訪問(wèn)int cnt = 0;//記錄部落個(gè)數(shù)for (auto it = s.begin(); it != s.end(); it++){int value = find(*it);pre[*it] = value;//路徑壓縮,直接與該部落首領(lǐng)掛鉤if (vist[value] == 0){cnt++;vist[value] = 1;}}printf("%d %d\n", s.size(), cnt);cin >> x;for (int i = 0; i < x; i++){cin >> number >> number1;if (pre[number] != pre[number1]) printf("N\n");//看是否屬于同一個(gè)部落else printf("Y\n");}}

總結(jié)

以上是生活随笔為你收集整理的C++学习之路 | PTA(天梯赛)—— L2-024 部落 (25分)(带注释)(并查集)(精简)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。