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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ 并查集模板

發布時間:2025/3/15 c/c++ 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++ 并查集模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

并查集一般在遇到求解冗余關系,關系合并,環的數量等問題的時候使用。不需要對各數值進行輸出。

注意與有向無環圖問題進行區分!

有向無環圖模板看這里:有向無環圖講解及模板(C++代碼)_子木呀的博客-CSDN博客_c++ 有向無環圖

并查集是一個很優美的數據結構,很多情況下,提煉問題后,可以用并查集進行解決,這里總結下并查集的模板及注釋,可以直接用

1.并查集的使用:

//初始化并查集 int n = xx.size(); UnionFindSet dsu(n);//初始化并查集//將兩個點合并 for(int i = 0; i < n; i++){dsu.merge(xx[i], xx[i])//...... }

2.并查集模板(直接用就行,可以根據需要修改返回值出代碼)?

有兩處優化:(1)查詢優化 (2)路徑優化

//并查集實現 class UnionFindSet{vector<int> F;//并查集容器vector<int> rank;//秩優化(如果兩個都有很多元素的根節點相遇,將根節點選為元素較少的那一個,可以節省時間)int n;public://并查集初始化UnionFindSet(int _n){n = _n;F.resize(n);rank.resize(n, 1);for(int i = 0; i < n; i++){F[i] = i;}}//并查集查詢操作int find(int x){return x == F[x] ? x : F[x] = find(F[x]);//查詢優化。找到x的根節點}//并查集合并操作bool merge(int x, int y){int fx = find(x), fy = find(y);if(fx == fy) return false;//兩個節點連在同一個根節點上則直接返回 不再合并//因為是將節點數少的連接到節點數多的節點上,當fx下面的節點數小于fy下面的節點數時,交換fx和fy//即兩個根節點相遇時,將新的根節點選為節點數較多的那一個,盡量減少find(x)的次數if(rank[fx] < rank[fy])//合并優化swap(fx, fy);F[fy] = fx;//將fy連到fx上(將節點數少的連接到節點數多的上面)rank[fx] += rank[fy];//將fy連到fx后 fx下面的節點數目要更新return true;} };

結合輸入的方式,不使用類。完全可以用的一個示例:

#include <iostream> #include<vector> #include<string> #include <unordered_map> #include <unordered_set> #include <queue> #include <algorithm>//算法頭文件 #include <numeric> #include <stack> #include<typeinfo> using namespace std;vector<int> F; // 初始化 void UnionFindSet(int N) {F.resize(N + 1, -1);//如果初始化是從1開始,這里就得用N+1 如果從0開始初始化 就用N(從多少開始初始化 根據輸入的數據進行調整)for (int i = 1; i <= N; i++){F[i] = i; // 初始化時, 將自己初始化為自己的領導} }// 查找 int find(int n) {return n == F[n] ? n : find(F[n]); }// 合并 這里直接在主程序里調用了查找 能夠省去調用合并函數的次數 void merge(int leaderX, int leaderY) {if (leaderX < leaderY){F[leaderX] = leaderY;}else{F[leaderY] = leaderX;} }// 輸入數組, 每一行表示一個集合關系, 比如第一行表示3和4屬于一個集合 int input[] = {1, 4,2, 5,3, 6,4, 2,5, 1,6, 3, };int main() {int N;cin >> N;int numberOfSets = N;// 初始化領導UnionFindSet(N);int n = sizeof(input) / sizeof(input[0]) / 2;//這地方根據輸入的形式調整int j = 0;for (int i = 0; i < n; i++){int u = input[j++];int v = input[j++];u = find(u);//這里直接在主程序里調用了查找 能夠省去調用合并函數的次數v = find(v);if (u != v) { //如果沒關系 就合并 最后numberOfSets就是不能合并的個數 也就是有幾個圈子merge(u, v);numberOfSets--;}}cout << numberOfSets << endl;return 0; }

統計某個節點下掛了多少個節點

#include <iostream> #include<vector> #include<string> #include <unordered_map> #include <unordered_set> #include <queue> #include <algorithm>//算法頭文件 #include <numeric> #include <stack> #include<typeinfo> using namespace std; vector<int> F; // 初始化 void UnionFindSet(int N) {F.resize(N + 1, -1);//如果初始化是從1開始,這里就得用N+1 如果從0開始初始化 就用N(從多少開始初始化 根據輸入的數據進行調整)for (int i = 1; i <= N; i++){F[i] = i; // 初始化時, 將自己初始化為自己的領導} }// 查找 int find(int n) {return n == F[n] ? n : find(F[n]); }int main() {int N, M;cin >> N >> M;vector<vector<int>> input;vector<int> intput1;int a,b;for (int i = 0; i < M; i++) {cin >> a >> b;intput1.push_back(a);intput1.push_back(b);input.push_back(intput1);}// 初始化領導UnionFindSet(N);for (int i = 0; i < M; i++){int u = input[i][0];int v = input[i][1];u = find(u);//這里直接在主程序里調用了查找 能夠省去調用合并函數的次數v = find(v);if (u != v) { //如果沒關系 就合并 最后numberOfSets就是不能合并的個數 也就是有幾個圈子F[v] = u;}}int numberOfSets = 0;for (int i = 0; i < F.size(); i++) {if (F[i] == 1)numberOfSets++;}cout << numberOfSets+1 << endl;return 0; }

總結

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

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

主站蜘蛛池模板: 国产精品毛片久久久久久久av | 亚洲成人网在线观看 | 欧美aⅴ在线观看 | 欧美一区二区三区四区视频 | 69人妻精品久久无人专区 | 操穴网站 | 久草新在线 | 丁香社区五月天 | 黄色免费大片 | 中出 在线| 9999av| 麻豆av免费| 国产精品蜜| 激情伊人 | 成人福利网址 | 欧美久久久久久又粗又大 | 91久久精品一区二区别 | 欧美乱妇高清无乱码 | 91小视频在线观看 | 亚洲第一色在线 | 大地资源中文在线观看免费版 | 一级性生活毛片 | 欧美性猛交xxxx乱大交hd | 日本无遮羞调教打屁股网站 | 亚洲va欧美va国产综合久久 | 成人一级视频 | 国产又粗又猛又黄又爽 | 欧美日本在线观看 | www.日韩精品 | 日韩av资源在线观看 | 色综合久久88色综合天天 | 天天操天天操天天操天天 | 久久久久久久色 | av免费片 | 国产一区二区精品在线 | 日韩精品中文字幕在线观看 | 极品国产白皙 | 奇米狠狠去啦 | 一级片一级 | 肉色超薄丝袜脚交一区二区图片 | 成人3d动漫一区二区三区91 | www.久久综合 | 免费观看91视频 | 伊人国产精品 | 日韩精品一区二区av | 亚洲视频在线一区二区 | 杏导航aⅴ福利网站 | 五月天狠狠操 | 超级乱淫视频 | 日本视频网站在线观看 | 色婷婷五| 亚洲综合在线成人 | 免费久久视频 | 精品人妻一区二区乱码 | 处女朱莉 | 91国偷自产一区二区三区老熟女 | 色97色| 丰腴饱满的极品熟妇 | 秋霞午夜视频 | 伊人网伊人影院 | av中字在线 | 熟妇人妻精品一区二区三区视频 | 澳门黄色录像 | 可以看黄色的网站 | 精品午夜久久 | 久久久久99精品成人片我成大片 | 动漫av一区| 亚洲一区二区自拍偷拍 | 国产成人自拍视频在线 | 国产伦理片在线观看 | 日本加勒比一区 | 人人狠狠综合久久亚洲 | 高跟鞋丝袜猛烈xxxx | 亚洲天堂一区二区在线 | 粗大的内捧猛烈进出 | 在线观看日批视频 | 亚洲最新色图 | 亚洲精品6| 在线观看成人一区 | 国产美女精品久久 | 欧美精品在线视频观看 | 九色网站在线观看 | 午夜男人天堂 | 日本伊人色 | 稀缺呦国内精品呦 | aaa在线视频 | 51热门大瓜今日大瓜 | 自拍偷拍在线视频 | 国产真实生活伦对白 | 熟女一区二区三区四区 | 亚洲欧美精品一区二区三区 | 美女张开腿流出白浆 | 粗大挺进潘金莲身体在线播放 | 在线免费视频一区 | 欧美裸体网站 | 亚洲一区二区激情 | 撸啊撸av| 超碰在线公开免费 | 日本zzjj|