查集講解(按秩合並與路徑壓縮)
阿新 • • 發佈:2018-08-03
ram == return n) style str fin bsp pre
自看。。。
借鑒自:https://blog.csdn.net/u011056504/article/details/51222494
1、路徑壓縮
void find(int x) { return f[x] == x ? x : (f[x] = find(f[x])); }
2、按秩合並
給每個點一個秩,其實就是樹高
每次合並的時候都用秩小的指向秩大的,可以保證樹高最高為log2(n)log2(n)
操作的時候,一開始所有點的秩都為1
在一次合並後,假設是點x和點y,x的秩小
當然x和y都是原來x和y所在區間的頂點
設點x秩為rank[x]
將fa[x]指向y,然後將rank[y]的與rank[x+1]取max
因為rank[x]為區間x的高,將它連向y之後,y的樹高就會是x的樹高+1,當然也可能y在另一邊樹高更高,所以取max
程序
同樣,fa[x]為x的父親,就是x指向的點,rank[x]為點x的秩
//查詢: void find(int x) { return f[x] == x ? x : find(f[x]); } //修改: int r = find(x); int l = find(y); if(r == l) continue; if(rank[l] <= rank[r]) f[l] = r, rank[r] = max(rank[r], rank[l] + 1); else f[r] = l, rank[l] = max(rank[l], rank[r] + 1);
查集講解(按秩合並與路徑壓縮)