标签:oid func 联合 复杂度 log 空间复杂度 ems 扁平化 最大的
function MakeSet(x) // 参数 => 选定的代表元
x.parent := x
function Find(x) // 参数 => 带查找的元素
if x.parent == x // 到达根节点
return x
else
return Find(x.parent)
function Union(x, y)
xRoot := Find(x)
yRoot := Find(y)
xRoot.parent := yRoot
总是将更小的树连接至更大的树上
秩 : 深度
影响运行时间的是树深度,更小的树添加到更深的树的根上不会增加秩除非他们同秩
单个元素秩定义为0,当两棵秩同为r的树联合时,他们的秩为r+1
最坏时间复杂度O(logN)
function MakeSet(x) // 初始化
x.parent := x
x.rank := 0 // 并查集树结构每个节点包含秩信息
function Union(x, y) // 合并
xRoot := Find(x)
yRoot := Find(y)
if xRoot == yRoot
return
// x和y不在同一个集合,合并他们。
if xRoot.rank < yRoot.rank
xRoot.parent := yRoot
else if xRoot.rank > yRoot.rank
yRoot.parent := xRoot
else
yRoot.parent := xRoot
xRoot.rank := xRoot.rank + 1
function Find(x)
if x.parent != x
x.parent := Find(x.parent) // 将每个节点引用到根节点
return x.parent
void Union(int x, int y) {
xRoot = Find(x); // 找到始祖
yRoot = Find(y); // 找到始祖
if (xRoot != yRoot)
parent[xRoot] = yRoot; // x -> y
}
bool same(int x, int y) {
return Find(x) == Find(y); // 比较始祖是否相同
}
int getfather(int v) {
if (parent[v] == v) // 根节点
return v; // 返回始祖
else {
parent[v] = getfather(parent[v]); // 路径压缩【递归】
return parent[v]; // 返回并查集根节点
}
}
void judge(int x, int y) {
// 寻找始祖
xRoot = Find(x);
yRoot = Find(y);
if (rank[xRoot] > rank[yRoot])
parent[yRoot] = xRoot;
else {
parent[xRoot] = yRoot; // 以yRoot为始祖
if (rank[xRoot] == rank[yRoot])
++rank[yRoot]; // 重要的是始祖的rank,只修改始祖的,其他的不用管
}
}
memset(rank, 0, sizeof(int)*rank_size);
标签:oid func 联合 复杂度 log 空间复杂度 ems 扁平化 最大的
原文地址:https://www.cnblogs.com/XyLee/p/12562762.html