ACM模板——并查集
生活随笔
收集整理的這篇文章主要介紹了
ACM模板——并查集
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
#define _for(i,a,b) for(int i = (a);i < (b);i ++)
const int maxn = 50003;
int par[maxn]; //父親
int high[maxn]; //樹的高度void init(int n)
{_for(i,0,n){par[i] = i;high[i] = 0;}
} int find(int x)
{return par[x] == x ? x : par[x] = find(par[x]);
}void unite(int x,int y)
{x = find(x);y = find(y);if(x==y) return ;if(high[x]<high[y])par[x] = y;else{par[y] = x;if(high[x]==high[y])high[x] ++;}
}bool same(int x,int y)
{return find(x) == find(y);
} 路徑壓縮普通并查集
?
#define _for(i,a,b) for(int i = (a);i < (b);i ++) const int maxn = 50003; int par[maxn]; //父親 void init(int n) {_for(i,0,n)par[i] = i; } int find(int x) {return par[x] == x ? x : find(par[x]); }void unite(int x,int y) {x = find(x);y = find(y);if(x==y) return ; par[x] = y; }bool same(int x,int y) {return find(x) == find(y); } 樸實無華的并查集?
#include <bits/stdc++.h> using namespace std;#define _for(i,a,b) for(int i = (a);i < (b);i ++) const int maxn = 50003; int par[maxn]; //父親 int high[maxn]; //樹的高度 int id[maxn]; //映射,里面裝的是現(xiàn)在真正的序號 int idEnd; void init(int n) {idEnd = n;_for(i,0,n){par[i] = id[i] = i;high[i] = 0;} } int find(int x) {return par[x] == x ? x : par[x] = find(par[x]); }void unite(int x,int y) {x = find(x);y = find(y);if(x==y) return ;if(high[x]<high[y])par[x] = y;else{par[y] = x;if(high[x]==high[y])high[x] ++;} }void del(int x) {id[x] = idEnd ++;high[id[x]] = 0;par[id[x]] = id[x]; }bool same(int x,int y) {return find(x) == find(y); }int main() {init(7);unite(id[1],id[4]);unite(id[2],id[4]);unite(id[3],id[4]);unite(id[4],id[5]);unite(id[6],id[5]);cout << same(id[4],id[5]) << endl;del(id[4]);cout << same(id[4],id[5]) << endl;cout << same(id[1],id[5]) << endl;cout << same(id[6],id[2]) << endl;return 0; } 帶刪除的路徑壓縮并查集?
map<string,int> IDcache; vector<string> Stringcache;int ID(string s) {if(IDcache.count(s)) return IDcache[s];Stringcache.push_back(s);return IDcache[s] = Stringcache.size()-1; } 集合映射以方便并查?種類并查集:POJ-1182,解題策略是并查集的每個集合內(nèi)的元素都同真或同假,所以每個動物就有3種可能的狀態(tài),在A或在B或在C。當?shù)趇個動物屬于集合A這一命題和第j個動物屬于集合B這一命題在并查集的同一集合內(nèi)時,若此時出現(xiàn)新命題,為第i個動物和第j個動物是在同一集合內(nèi),只需要看i屬于A這一狀態(tài)是否和j屬于B或者j屬于C在并查集同一集合內(nèi),如果在同一集合內(nèi),說明兩命題同真或同假,那么很顯然新命題就是錯誤的,這樣就能判定新命題的真假。
主要思想是由于動物種類的不確定,所以只能以命題的形式將多個命題通過并查集連接起來,以判斷命題的真假。
?
帶權并查集:主要思想是將一個并查集內(nèi)的每個集合中的每個元素賦予一個權值,這個權值的意義可以是多樣的,比如他與根節(jié)點的關系,或者不使用路徑壓縮時以他為根的權值之和。要多用一個數(shù)組,其大小就是總元素個數(shù),來表示各種權值。
轉載于:https://www.cnblogs.com/Asurudo/p/10454766.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的ACM模板——并查集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java多线程的几种实现方法
- 下一篇: 【Java架构:持续交付】一篇文章搞掂: