最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++并查集算法簡單詳解

 更新時間:2022年02月14日 10:15:37   作者:Curz酥  
大家好,本篇文章主要講的是C++并查集算法簡單詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下

1、并查集的初始化

并查集是用一個數(shù)組實現(xiàn)的。首先先定義一個數(shù)組:

int father[N];

father[i]表示元素i的父親結(jié)點。

接下來進行初始化。一開始,每個元素都分別是獨立的一個集合,父親結(jié)點就是它自己,所以初始化時將所有father[i]等于i:

for(int i = 1; i <= N; i++){
    father[i] = i;
}

 這樣,就將father數(shù)組初始化完畢。

2、并查集的查找操作

由于規(guī)定同一個集合中只存在一個根結(jié)點,因此查找操作,就是查找給定結(jié)點的根結(jié)點的過程??梢酝ㄟ^遞推或遞歸來實現(xiàn),思路都是一樣的,都是反復(fù)尋找父親結(jié)點,直到找到根結(jié)點為止。

遞推代碼:

//findFather函數(shù)返回元素x所在集合的根結(jié)點
int findFather(int x){
    while(x != father[x]){    //如果不是根結(jié)點,繼續(xù)循環(huán)
        x = father[x];    //獲得自己的父親結(jié)點
    }
    return x;
}

上述代碼中, while(x != father[x]),說明當(dāng)x的父親結(jié)點不等于本身時,也就是x不是根結(jié)點時就繼續(xù)循環(huán),因為父親結(jié)點等于本身這個情況,只有在根結(jié)點才會出現(xiàn)。

遞歸代碼:

int findFather(int x){
    if(x == father[x]) return x;    //如找到根結(jié)點,就返回根結(jié)點編號x
    else return findFather(father[x]); //否則,遞歸判斷x的父親結(jié)點是否是根結(jié)點
}

3、并查集的合并操作

合并,就是把兩個集合合并成一個集合。實現(xiàn)過程是:先判斷兩個元素是否屬于同一個集合,不屬于同一個集合,就開始進行合并操作。判斷兩個元素是否屬于同一個集合的具體思路,就是調(diào)用上面的findFather函數(shù),分別查找兩個元素所屬集合的根結(jié)點,根結(jié)點不同,則兩個元素不屬于同一個集合。合并兩個集合的具體思路,就是將其中一個集合的根結(jié)點的父親指向另外一個集合的根結(jié)點即可。

合并操作的代碼實現(xiàn):(假設(shè)有兩個集合,一個集合里有元素a,一個集合有元素b)

void Union(int a, int b){
    //讓一個集合的根結(jié)點的父親指向另一個集合的根結(jié)點
    father(findFather(a)) = findFather(b); 
}

注意,合并操作之前,最好先判斷下待合并的兩個元素是否位于同一個集合。

4、為什么要路徑壓縮?

5、實現(xiàn)路徑壓縮

由于findFather函數(shù)目的就是查找根結(jié)點,所以,我們在查找結(jié)點的路徑上直接將所有結(jié)點的父親都指向根結(jié)點,查找的時候就不必一直回溯去尋找父親了,查詢的復(fù)雜度可以降為O(1)。

比如下面這張圖:

觀察圖不難發(fā)現(xiàn),上圖中father[1] = 1,father[2] = 1,father[3] = 2,father[4] = 3。經(jīng)過路徑壓縮,就變成下面這幅圖:

相當(dāng)于將所有結(jié)點的父親都直接指向根結(jié)點,這就是路徑壓縮。

如何用代碼實現(xiàn)路徑壓縮呢?以下是具體代碼:

int findFather(int x){
    if(father[x] != x) father[x] = findFather(father[x]);
    return father[x];
}

 以上代碼,實現(xiàn)了在查詢獲取根結(jié)點的同時,將路徑進行壓縮優(yōu)化,代碼雖然很短,但是很巧妙,下面解釋下上述代碼:

 if(father[x] != x),當(dāng)所查找的元素x的父親結(jié)點不是自己,也就是x不是根結(jié)點時,

findFather(father[x]),就繼續(xù)遞歸查找父結(jié)點,直到找到根結(jié)點為止,

father[x] = findFather(father[x]),然后將找到的根結(jié)點直接賦給x的父親結(jié)點。

這樣就實現(xiàn)了路徑壓縮,即將結(jié)點的父親直接指向根結(jié)點。

return father[x],返回查找到的根結(jié)點。

總結(jié)

到此這篇關(guān)于C++并查集算法簡單詳解的文章就介紹到這了,更多相關(guān)C++并查集算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++語言中結(jié)構(gòu)體的內(nèi)存分配小例子

    C/C++語言中結(jié)構(gòu)體的內(nèi)存分配小例子

    當(dāng)未用 #pragma 指令指定編譯器的對齊位數(shù)時,結(jié)構(gòu)體按最長寬度的數(shù)據(jù)成員的寬度對齊;當(dāng)使用了 #pragma 指令指定編譯器的對齊位數(shù)時,結(jié)構(gòu)體按最長寬度的數(shù)據(jù)成員的寬度和 #pragma 指令指定的位數(shù)中的較小值對齊
    2013-10-10
  • C/C++實現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法

    C/C++實現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換的多種方法

    在C/C++程序中,會需要把數(shù)字與字符串做出互相轉(zhuǎn)換的操作,用于實現(xiàn)程序想要的效果,下面將介紹多種方法實現(xiàn)數(shù)字與字符串互相轉(zhuǎn)換,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-08-08
  • C++中的std::nothrow使用

    C++中的std::nothrow使用

    這篇文章主要介紹了C++中的std::nothrow使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言位段(位域)機制結(jié)構(gòu)體的特殊實現(xiàn)及解析

    C語言位段(位域)機制結(jié)構(gòu)體的特殊實現(xiàn)及解析

    這篇文章主要為大家介紹了C語言位段位域機制結(jié)構(gòu)體的特殊實現(xiàn)講解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-02-02
  • C++之編寫高效Makefile文件最佳方法

    C++之編寫高效Makefile文件最佳方法

    在軟件開發(fā)過程中,Makefile是一個非常重要的工具,它可以幫助我們自動化構(gòu)建、編譯、測試和部署,然而,編寫高效的Makefile文件并不是一件容易的事情。在本文中,我們將討論如何編寫高效的Makefile文件,以提高開發(fā)效率和產(chǎn)品質(zhì)量,需要的朋友可以參考下
    2023-05-05
  • c語言打印輸出雙引號的方法示例

    c語言打印輸出雙引號的方法示例

    這篇文章主要介紹了c語言打印輸出雙引號的方法,大家參考使用吧
    2013-11-11
  • C語言代碼實現(xiàn)簡單掃雷小游戲

    C語言代碼實現(xiàn)簡單掃雷小游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C++ STL 序列式容器與配接器的簡單使用

    C++ STL 序列式容器與配接器的簡單使用

    本文主要介紹了C++ STL 序列式容器與配接器的簡單使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • C++二分查找算法實例

    C++二分查找算法實例

    這篇文章主要為大家詳細(xì)介紹了C++二分查找算法的實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C++ const和指針詳情

    C++ const和指針詳情

    這篇文章主要介紹了C++ const和指針,關(guān)于使用const來修飾指針,有兩種不同的方式。第一種是讓指針指向一個常量對象,這樣可以防止使用該指針進行修改指向的值。第二種則是將指針本身聲明為常量,可以防止改變指針指向的位置,下面來看看文章的詳細(xì)內(nèi)容
    2021-11-11

最新評論

汉寿县| 象山县| 新闻| 汨罗市| 阿瓦提县| 德化县| 兴化市| 宁明县| 江孜县| 郎溪县| 报价| 隆林| 交口县| 朔州市| 保亭| 大悟县| 莎车县| 高安市| 平度市| 蓝田县| 务川| 平和县| 呈贡县| 新闻| 威远县| 句容市| 淄博市| 高平市| 托里县| 丹棱县| 白水县| 莲花县| 纳雍县| 黄浦区| 北碚区| 察隅县| 通辽市| 上饶县| 元氏县| 安丘市| 吐鲁番市|