1. 程式人生 > >查集講解(按秩合並與路徑壓縮)

查集講解(按秩合並與路徑壓縮)

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
);

查集講解(按秩合並與路徑壓縮)