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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

杭电1856——并差集

發布時間:2024/3/12 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 杭电1856——并差集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

杭電1856——并差集

原題傳送門,并差集的簡單介紹,大佬并差集詳解。
解題思路:
這個算并差集的裸題吧。先將輸入的數據(還沒有連接的數據)全部用meg函數連起來,然后用fin函數遍歷每個男孩最上面的父親,用ans數組記錄最上面的父親出現的次數(ans[i]=9:i是幾個人的父親);然后遍歷ans數組,找出最大的值就是答案。

注意:
1、fin函數有很多種寫法,這里我建議用路徑壓縮,沒用路徑壓縮的,還沒試過,不知道能不能ac。
2、數據上限是10^7,如果開三個1e7的數組會爆空間的,因此,我只開了兩個數組:id,記錄父親(這個是必須的);ans,記錄父親出現的次數。

ac代碼

# include <iostream> # include <algorithm> # include <cstdio> # include <cstdlib> # include <string> # include <cstring> # include <vector> using namespace std;const int maxn = 1e7 + 5; int id[maxn]; int ans[maxn];int fin(int x) {return id[x] = id[x] == x ? x : fin(id[x]); } void meg(int x, int y) {int a = fin(x);int b = fin(y);if (a < b) {id[a] = b;}else {id[b] = a;} } bool same(int x, int y) {return fin(x) == fin(y); }int main() {ios::sync_with_stdio(false);//freopen("mainin.txt", "r", stdin);int n;while (cin >> n) {for (int i = 0; i < maxn; i++) {id[i] = i;}memset(ans, 0, sizeof(ans));while (n--) {int a, b;cin >> a >> b;if (!same(a, b)) {meg(a, b);}}for (int i = 0; i < maxn; i++) {ans[fin(i)]++;}int mx = -1;for (int i = 0; i < maxn; i++) {mx = mx > ans[i] ? mx : ans[i];}cout << mx << endl;;}return 0; }

總結

以上是生活随笔為你收集整理的杭电1856——并差集的全部內容,希望文章能夠幫你解決所遇到的問題。

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