並查集就是乙個可以連通一塊東西的工具。
基礎:這麼理解吧,有一堆親戚,每次給你兩個人,告訴你他們是親戚,最後任意給你兩個人,問他們是不是親戚。
這個時候,並查集就大顯神通了。我們可以每次輸入兩個數,如果這兩個數不在一塊,把這兩個數連線起來,到了最後,不就是變成了一棵樹了嗎?最後查詢時,每次看他們是不是在一棵樹上就行,也就可以查詢他們的根是不是一樣的。
並查集實現的就是大概這樣乙個功能,下面給出**:
查詢:
int find(int x)
合併:
void un(int x , int y)
\(fa[i]\)就是指某乙個節點的父親,對其初始化時肯定是\(fa[i]=i\),指向自己。
優化可是,有的時候,這條鏈會被拉的很長,像這樣:
很長的鏈~
這樣往上搜尋時,會很耗費時間,這個時候怎麼辦呢,優化:
路徑壓縮:
因為我們只用找到他們的根節點就可以看他們是不是一起的了,為何不讓他們都直接指向根節點呢?像這樣:
很短的鏈~
這樣過後,查詢時間就變短了,合併的**肯定就不變了,下面給出查詢的**:
int find(int x)
總結:其實優化還有一種方法,叫按秩合併,但是優化作用沒路徑壓縮大,也不太好寫,只有路徑壓縮就已經夠了嗐就是不會而已。
億道並查集聯絡題:乳酪
並查集小結
並查集一類的題目最近也做了許多,相對來說,還是比較容易理解和實現的。最早開始接觸並查集是在學習用kruskal求最小生成樹的時候,後來接觸的題目多了,發現並查集還有好多用途,比如典型的判環,區間問題等等。學習並查集的過程中我發現,並查集的路徑壓縮十分重要,有時候對於題目限定的條件,在路徑壓縮的過程中...
並查集小結
小做了一下並查集相關的題目。就從最基礎的開始吧。首先是並查集的介紹,非常好的一篇博文 其次就是一些習題了。首先是這道題目 poj1308 is it a tree?整道題就是需要你判斷給出乙個有向圖是不是一棵樹。這裡會使用到並查集來判環,算是並查集的基礎應用 也就是判斷元素是不是屬於乙個集合 然後是...
並查集小結
並查集一類的題目最近也做了許多,相對來說,還是比較容易理解和實現的。最早開始接觸並查集是在學習用kruskal求最小生成樹的時候,後來接觸的題目多了,發現並查集還有好多用途,比如典型的判環,區間問題等等。學習並查集的過程中我發現,並查集的路徑壓縮十分重要,有時候對於題目限定的條件,在路徑壓縮的過程中...