简析并查集[C/C++]
生活随笔
收集整理的這篇文章主要介紹了
简析并查集[C/C++]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
并查集,是一個集合,主要為了實現了合并和查找兩個功能
根據不同的題目需求進行使用
Union and Find Set (UFSet)
結構抽象: 樹形結構
一般做題類型: 等價類
但是為了確保并查集的退化,所以,在進行合并的時候不像一般的集合合并一樣。
本質上是數組(線段樹,如果你熟悉樹的結構的話)
當數值為 負數的時候,表示這是一個根(其絕對值大小,表示的是對應樹形下的 節點數目,包括自己)
否者就是指向的parent對應的index
查找函數:
int find(int x){if (x < 0) return -1;while (parent[x] > 0) x = parent[x];return x; }一般的合并函數:
void Union(int root1, int root2){parent[root1] += parent[root2];parent[root2] = root1; }但很顯然,如果這樣子不斷地合并,很有可能會出現變成一條直線的退化(大大提高樹形結構的層數)。
所以有一種改良方法:
就是說,每次都是將對應的樹的根節點進行比較,將小樹作為第一個層的孩子,粘附在大樹的上。這樣就可以避免樹形結構層數過高的問題
void weightUnion(int root1, int root2){int p1 = find(root1), p2 = find(root2);int temp;if (p1 != p2) {temp = parent[p1] + parent[p2];if (parent[p1] < parent[p2]){parent[p2] = p1;parent[p1] = temp;} else {parent[p1] = p2;parent[p2] = temp;}} }總結
以上是生活随笔為你收集整理的简析并查集[C/C++]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安装Scrapy遇到Comand c:\
- 下一篇: QT实现minheap(简单图形界面掌握