可撤銷並查集用啟發式合併來優化。
用乙個棧來記錄合併的操作,按照逆序恢復到原來的狀態。
記錄乙個撤銷棧,元素為有序對,如果撤銷這個步驟則令
*pelem=nvalue
即可。那麼在啟發式合併的時候,每次修改了什麼就記錄什麼,撤銷的時候刪除即可。
#include using namespace std;
#define int long long
const int n = 1000005;
struct dsu
}int find(int p)
void merge(int p,int q)
);fa[p]=q;
if(rank[p]==rank[q])
);++rank[q];
}else);}
}}
void _undo()
sta.pop();
}void undo()
void print(int n)
if(op=="undo")
dsu.print(n);
}}
演算法筆記 可撤銷並查集 可持久化並查集
可撤銷並查集模板 struct ufs inline int find int x inline void merge int x,int y fa x y if rnk x rnk y rnk y else fa y x inline void undo ufs 可持久化並查集模板 struct ...
可持久化並查集 可撤銷並查集
主要學習的blog 1 將乙個點的父親 並查集那個fa 進行更改 實際上是新增乙個資訊點 update。2 查詢某個時間點下乙個pos對應的資訊點編號。3 查詢乙個點的父節點。4 更新乙個點的deep值,不用新寫函式,可以用3號操作找到編號後 5 初始化build。pragma gcc optimi...
帶撤銷並查集 可持久化並查集
帶撤銷並查集支援從某個元素從原來的集合中撤出來,然後加入到乙個另外乙個集合中,或者刪除該元素 用乙個對映來表示元素和並查集中序號的關係,中用 to x 表示x號元素在並查集中的 id 刪除 x 號元素時,需要將 to x 的集合大小減去1,然後令 to x 1 標記 x 刪除即可 如果要重新加入乙個...