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

c++初級(jí)并查集知識(shí)點(diǎn)總結(jié)

 更新時(shí)間:2019年07月08日 14:17:34   作者:Alex___Wei  
在本篇文章里小編給各位分享的是關(guān)于c++初級(jí)并查集知識(shí)點(diǎn)以及實(shí)例代碼內(nèi)容,有需要的朋友們學(xué)習(xí)下。

并查集是一種樹(shù)型的數(shù)據(jù)結(jié)構(gòu),用于處理一些不交集的合并及查詢問(wèn)題。

有一個(gè)聯(lián)合- 查找算法定義了兩個(gè)用于此數(shù)據(jù)結(jié)構(gòu)的操作:

  • Find :確定元素屬于哪一個(gè)子集。它可以被用來(lái)確定兩個(gè)元素是否屬于同一子集。
  • Union:將兩個(gè)子集合并成同一個(gè)集合。

并查集主要運(yùn)用在合并元素以及查詢兩個(gè)元素是否在同一集合的問(wèn)題,在信息學(xué)競(jìng)賽中廣泛涉及

初始化:

一開(kāi)始,每一個(gè)元素都是一個(gè)集合,打個(gè)比方,每個(gè)人所在的 " 家族 " 只有他一個(gè)人。我們還需要一個(gè) f 數(shù)組,里面存的是他的 “父親” 的編號(hào),初始值為 f[1]=1,f[2]=2……f[n]=n,如圖

2、find函數(shù):find(a)是用來(lái)查找a的“祖先”的,例如,我們要查找 a 的祖先,就要去找 a 的父親的父親……,直到有個(gè)人 b ,他的父親就是他自己,那么 b 就是 a 的祖先代碼如下:int find (int x){    if(f[x] == x) return x;//如果x的父親就是他自己,則x為a的祖先 else return find (f[x]);//否則a的祖先 就是a的父親的祖先}int x=find(a);find函數(shù):find(a)是用來(lái)查找a的“祖先”的,例如,我們要查找 a 的祖先,就要去找 a 的父親的父親……,直到有個(gè)人 b ,他的父親就是他自己,那么 b 就是 a 的祖先代碼如下:int find (int x){    if(f[x] == x) return x;//如果x的父親就是他自己,則x為a的祖先 else return find (f[x]);//否則a的祖先 就是a的父親的祖先}int x=find(a);

union函數(shù):

union(a,b) 就是合并 a,b 這兩個(gè)人所在的家族,只需要把 a的祖先的父親 指向 b的祖先

如何合并?我們?cè)O(shè) u=find(a),v=find(b) , 只要將 u,v 其中一個(gè)人的父親編號(hào)指向另外一個(gè)人就行了,例如 f[u]=v

代碼如下:

void Union (int a,int b)//因?yàn)閡nion是c++的保留字,所以只好大寫(xiě)u

{

  int u= find(a), v= find(b);//尋找a,b的祖先

  f[u]=v;//合并家族

}

Union (a,b);

在合并的時(shí)候還有一個(gè)注意點(diǎn):為什么不能直接把 a 的父親指向 b ?因?yàn)檫@樣并不能合并完全,a 的父親, a 的父親的父親……,都不能合并到 b 的家族里(想一想,為什么?),如圖

5、查詢兩個(gè)元素是否在同一集合里:查詢 a,b 是否在同一集合里,就是看他們的祖先是否相等,若相等則在同一集合里,否則就不在代碼如下:if( find(a) == find(b) ) cout<<"Y\n"; //如果祖先相等就輸出“Y”else cout<<"N\n"; //否則輸出“N”查詢兩個(gè)元素是否在同一集合里:查詢 a,b 是否在同一集合里,就是看他們的祖先是否相等,若相等則在同一集合里,否則就不在代碼如下:if( find(a) == find(b) ) cout<<"Y\n"; //如果祖先相等就輸出“Y”else cout<<"N\n"; //否則輸出“N”

例題:

 至此,你應(yīng)該對(duì)并查集有了初步的了解,是時(shí)候上例題了

題目描述

如題,現(xiàn)在有一個(gè)并查集,你需要完成合并和查詢操作。

輸入輸出格式

輸入格式:

第一行包含兩個(gè)整數(shù)N、M,表示共有N個(gè)元素和M個(gè)操作。

接下來(lái)M行,每行包含三個(gè)整數(shù)Zi、Xi、Yi

當(dāng)Zi=1時(shí),將Xi與Yi所在的集合合并

當(dāng)Zi=2時(shí),輸出Xi與Yi是否在同一集合內(nèi),是的話輸出Y;否則話輸出N

輸出格式:

如上,對(duì)于每一個(gè)Zi=2的操作,都有一行輸出,每行包含一個(gè)大寫(xiě)字母,為Y或者N

其實(shí),這道題目就是把上面幾個(gè)步驟綜合在一起,代碼如下

并查集的路徑壓縮

路徑壓縮,顧名思義,就是將本來(lái)要很多步完成的事情壓縮成一步

因?yàn)槲覀兠看?nbsp;find(a) 都要消耗 O (a 的層數(shù) ) 的時(shí)間,如果數(shù)據(jù)構(gòu)造成一條鏈,則每次 find 都需要 O(n) 的時(shí)間,這是我們不希望看到的

所以,我們可以把 f 數(shù)組的性質(zhì)改變一下 f[a] 指向的編號(hào)變?yōu)?nbsp;a 的祖先

代碼該怎么寫(xiě)呢?我們只需要在 find 函數(shù)里把

return find (f[x]);

變成

return f[x]=find(f[x]);

就可以了

這樣每一次 find 都會(huì)使路徑上的每個(gè) f[x] 指向 x 的祖先,每一次 find 也就只需要 1 步就行了(除非被合并過(guò),那也只需要 2 步),這就是路徑壓縮的實(shí)質(zhì)

相關(guān)文章

  • C/C++實(shí)現(xiàn)捕獲所有信號(hào)的示例詳解

    C/C++實(shí)現(xiàn)捕獲所有信號(hào)的示例詳解

    Linux的信號(hào)機(jī)制大部分情況下用不到,但是由于大部分信號(hào)的默認(rèn)處理是終止進(jìn)程,不正確處理會(huì)惹麻煩,所以我們來(lái)看看如何使用C/C++實(shí)現(xiàn)捕獲所有信號(hào)吧
    2024-03-03
  • OPENMP?SECTIONS?CONSTRUCT原理示例解析

    OPENMP?SECTIONS?CONSTRUCT原理示例解析

    這篇文章主要為大家介紹了OPENMP?SECTIONS?CONSTRUCT原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • C++ string 字符串查找匹配實(shí)例代碼

    C++ string 字符串查找匹配實(shí)例代碼

    下面小編就為大家?guī)?lái)一篇C++ string 字符串查找匹配實(shí)例代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • 淺談Qt實(shí)現(xiàn)HTTP的Get/Post請(qǐng)求

    淺談Qt實(shí)現(xiàn)HTTP的Get/Post請(qǐng)求

    本文主要介紹了淺談Qt實(shí)現(xiàn)HTTP的Get/Post請(qǐng)求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • C++利用map實(shí)現(xiàn)并查集

    C++利用map實(shí)現(xiàn)并查集

    這篇文章主要為大家詳細(xì)介紹了C++利用map實(shí)現(xiàn)并查集,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語(yǔ)言編程基礎(chǔ)char類型轉(zhuǎn)換示例

    C語(yǔ)言編程基礎(chǔ)char類型轉(zhuǎn)換示例

    這篇文章主要為大家介紹了C語(yǔ)言編程基礎(chǔ)char類型轉(zhuǎn)換示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • C語(yǔ)言中isalnum()函數(shù)和isalpha()函數(shù)的對(duì)比使用

    C語(yǔ)言中isalnum()函數(shù)和isalpha()函數(shù)的對(duì)比使用

    這篇文章主要介紹了C語(yǔ)言中isalnum()函數(shù)和isalpha()函數(shù)的對(duì)比使用,都可以判斷是否為字母但isalnum的判斷還包括數(shù)字,需要的朋友可以參考下
    2015-08-08
  • c++快速排序詳解

    c++快速排序詳解

    快速排序總體思想:先找到一個(gè)樞軸,讓他作為分水嶺,通過(guò)一趟排序?qū)⒋判虻挠涗浄指畛蓛刹糠?前面一部分都比樞軸小,后面一部分樞軸大,然后又分別對(duì)這兩部分記錄繼續(xù)進(jìn)行遞歸的排序,達(dá)到整個(gè)序列有序的目的
    2017-05-05
  • c++中strcpy函數(shù)在VS2015無(wú)法使用的問(wèn)題

    c++中strcpy函數(shù)在VS2015無(wú)法使用的問(wèn)題

    這篇文章主要介紹了c++中strcpy函數(shù)在VS2015無(wú)法使用的問(wèn)題,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-11-11
  • C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)銀行ATM存取款功能

    C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)銀行ATM存取款功能

    這個(gè)是大一時(shí)期寫(xiě)的。大四的時(shí)候整理了一下(本人C語(yǔ)言學(xué)的也不太好)??隙ê芏嗖蛔愫痛嬖诼┒吹牡胤?、僅供借鑒、僅供借鑒,代碼中有大量注釋,新手看起來(lái)也沒(méi)有困難
    2021-11-11

最新評(píng)論

肥乡县| 六安市| 华宁县| 若尔盖县| 阿图什市| 内丘县| 博罗县| 垫江县| 图木舒克市| 安吉县| 四会市| 逊克县| 阿拉善盟| 漳州市| 东乡| 合江县| 穆棱市| 镇雄县| 佛坪县| 宜城市| 靖边县| 弥勒县| 乌兰县| 仪征市| 新田县| 中西区| 龙山县| 龙江县| 连江县| 浦东新区| 蒙山县| 毕节市| 清涧县| 无棣县| 云安县| 东莞市| 怀化市| 饶河县| 宝丰县| 延安市| 陆丰市|