/*===并查集===*/
class Node {
public:
Node *parent;
Node() : parent(NULL) {}
};
Node *find(Node *x) {
Node *p = x;
if (p->parent == NULL)return p;
set<Node *> path;
while (p->parent != NULL) {
path.insert(p);
p = p->parent;
}
// 优化,缩短路径,所有经过的父节点都变成最终父节点的直接儿子
for (set<Node *>::iterator iter = path.begin(); iter != path.end(); ++iter) {
(*iter)->parent = p;
}
return p;
}
void merge(Node *n1, Node *n2) {
find(n2)->parent = find(n1);
}
/*===并查集 end===*/
基于类实现并查集
猜你喜欢
转载自blog.csdn.net/zhengwei223/article/details/87365768
今日推荐
周排行