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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

岛屿(并查集)

發布時間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 岛屿(并查集) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
P1714【Week4】島嶼
時間限制 : 10000 MS?? 空間限制 : 128000 KB
問題描述

湖面上有 n 座島嶼,從1~n 編號。現在要湖上建橋使得島嶼連接起來。橋雙向通行。

輸入格式

輸入第一行有兩個整數 n,m。
接下來是 m 行,按照時間順序每行是一次詢問。
每行第一個整數q 代表詢問的內容:
如果q=1,則接下來是兩個島嶼編號a,b(a≠b);
如果q=2,則接下來是一個島嶼編號c。

輸出格式

對于每個詢問,按次序各輸出一行作為回答:
q=1 時:如果a,b 相互可達,則輸出Yes;如果a,b 相互不可達,則輸出No,并在a,b之間建一座橋。
q=2 時:輸出一個整數x,表示由c 出發可以到達的島嶼有x 個(不包括c 自身)。

樣例輸入

5?9
1?2?3
1?3?2
2?1
2?2
1?4?5
1?2?4
1?2?5
2?4
2?5

樣例輸出

No
Yes
0
1
No
No
Yes
3
3

提示

對于 100%的數據,2≤n≤10,000, 1≤m≤30,000。

問題分析: 問題1:查詢a,b兩個元素是否位于同一個集合,若不是,將兩個集合合并。 問題2:詢問元素c所在集合的元素的個數。 合并時 集合個數相加 code: // #include<bits/stdc++.h> using namespace std; #define maxnn 30100 int f[maxnn],cnt[maxnn]; int q; int n,m; int gf(int v) {return f[v]==v? v: f[v]=gf(f[v]); } void merge(int x,int y) {int fx=gf(x);int fy=gf(y);if(fx!=fy){f[fx]=fy;cnt[fy]+=cnt[fx];} } int main() {cin>>n>>m;int x,y;for(int i=1;i<=n;i++)f[i]=i,cnt[i]=1;for(int i=1;i<=m;i++){cin>>q;if(q==1){cin>>x>>y;if(gf(x)==gf(y))cout<<"Yes"<<endl;elsecout<<"No"<<endl;if(!(gf(x)==gf(y)))merge(x,y);}else{cin>>x;cout<<cnt[gf(x)]-1<<endl;}}}

?

轉載于:https://www.cnblogs.com/OIEREDSION/p/11260121.html

總結

以上是生活随笔為你收集整理的岛屿(并查集)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。