今天給SDUT的ACMer看了看并查集,總結總結下:
并查集,干的就是“并”和“查”兩件事。很多與集合相關的操作都可以用并查集高效的解決。
int Find(int x)
{
if (tree[x].parent != x)
{
tree[x].parent = Find(tree[x].parent);
}
return tree[x].parent;
}
void Merge(int a, int b, int p, int q, int d)
{
if (tree[q].depth > tree[p].depth) tree[p].parent = q;
else
{
tree[q].parent = p;
if (tree[p].depth == tree[q].depth) tree[p].depth++;
}
}
其中Find()函數用了路徑壓縮優化,而Merge()函數用了啟發式合并的優化(個人感覺有了路徑壓縮,啟發式合并優化的效果并不明顯,而經常因為題目和代碼的限制,啟發式合并會被我們省略)。
有個問題,如何求節點到跟節點的距離?