之前暑假集訓的時候學了一下並查集,但是那個時候完全搞不懂種類並查集(帶權並查集)的路徑壓縮以及兩個節點關係的合併。
現在有重新學習了一下,算是對種類並查集有了一些粗淺的理解了吧。
關於路徑壓縮:
int find(intx)
其實之前我就不是很懂,為什麼要設乙個temp儲存father[x]的值,不應該像下面的**這樣的嗎。(現在想想我好蠢。。
int find(intx)
但是father[x]跟find(father[x])的值有可能是不一樣的。
而路徑更新一定是當前節點與根節點的關係+當前節點父節點跟根節點的關係取模才對。(具體證明可以看我上面推薦的部落格。
所以我的想法就很可笑。
之後我之前還有個問題就是我之前是寫成這樣的
int find(intx)//把father[x]的更新放在rela更新的後面
這樣是有問題的。這樣的話,當前節點父節點跟根節點的關係可能就是沒有更新之前的錯誤關係,就會導致程式錯。
關於兩個合併節點之間的更新的話,其實就是窮舉找規律得出來的。並不是特別難懂的東西,在這裡就不提及了
並查集的一些理解
從最基本的並查集之後引申到帶權並查集 抽象出種類並查集 實際上都是維護乙個又乙個集合之間的關係 並查集主要寫兩個函式find和merge find函式可以寫成路徑壓縮 或者 按秩合併 或者兩個同時寫 但一般單獨的路徑壓縮就可以了 find函式需要注意的是在find函式內維護陣列 需要等回溯時再維護 ...
種類並查集
先來經典題目poj 1182 其實我現在都不是很明白這個題是怎麼做的 這道題貌似是並查集和向量做的,其中的關係推斷現在不是很明白。只知道和根節點的關係有三種,一種是同類 rank x 0 一種是被根節點吃掉 rank x 1 一種是吃掉根基點 rank x 2 如果不是很明白這道題的話可以跳過這道題...
種類並查集
食物鏈 poj 1182 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示x和y...