【发布时间】:2021-08-22 09:27:59
【问题描述】:
来自cp-algorithms网站:
有时在 DSU 的特定应用中,您需要保持顶点与其集合的代表之间的距离(即树中从当前节点到树根的路径长度)。
并给出以下代码作为实现:
void make_set(int v) {
parent[v] = make_pair(v, 0);
rank[v] = 0;
}
pair<int, int> find_set(int v) {
if (v != parent[v].first) {
int len = parent[v].second;
parent[v] = find_set(parent[v].first);
parent[v].second += len;
}
return parent[v];
}
void union_sets(int a, int b) {
a = find_set(a).first;
b = find_set(b).first;
if (a != b) {
if (rank[a] < rank[b])
swap(a, b);
parent[b] = make_pair(a, 1);
if (rank[a] == rank[b])
rank[a]++;
}
}
我不明白这种与代表的距离有何用处,因为它仅表示与我们数据结构中的集合领导者的距离,这可能与我们的原始问题无关。
我尝试了几个示例来查看当我们执行 union_sets 和 make_set 之类的操作时距离如何变化,但没有弄清楚任何事情。我的问题是这种“与代表的距离”代表什么,或者说它的意义或用途是什么。
任何可视化或理解它的帮助表示赞赏。
【问题讨论】:
标签: c++ algorithm data-structures disjoint-union