ACM模板——并查集
?
#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); } 樸實(shí)無華的并查集?
#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,解題策略是并查集的每個(gè)集合內(nèi)的元素都同真或同假,所以每個(gè)動物就有3種可能的狀態(tài),在A或在B或在C。當(dāng)?shù)趇個(gè)動物屬于集合A這一命題和第j個(gè)動物屬于集合B這一命題在并查集的同一集合內(nèi)時(shí),若此時(shí)出現(xiàn)新命題,為第i個(gè)動物和第j個(gè)動物是在同一集合內(nèi),只需要看i屬于A這一狀態(tài)是否和j屬于B或者j屬于C在并查集同一集合內(nèi),如果在同一集合內(nèi),說明兩命題同真或同假,那么很顯然新命題就是錯誤的,這樣就能判定新命題的真假。
主要思想是由于動物種類的不確定,所以只能以命題的形式將多個(gè)命題通過并查集連接起來,以判斷命題的真假。
?
帶權(quán)并查集:主要思想是將一個(gè)并查集內(nèi)的每個(gè)集合中的每個(gè)元素賦予一個(gè)權(quán)值,這個(gè)權(quán)值的意義可以是多樣的,比如他與根節(jié)點(diǎn)的關(guān)系,或者不使用路徑壓縮時(shí)以他為根的權(quán)值之和。要多用一個(gè)數(shù)組,其大小就是總元素個(gè)數(shù),來表示各種權(quán)值。
轉(zhuǎn)載于:https://www.cnblogs.com/Asurudo/p/10454766.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的ACM模板——并查集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java多线程的几种实现方法
- 下一篇: 【Java架构:持续交付】一篇文章搞掂: