91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c++并查集知識點有哪些

發布時間:2021-11-20 14:44:43 來源:億速云 閱讀:148 作者:iii 欄目:編程語言

這篇文章主要介紹“c++并查集知識點有哪些”,在日常操作中,相信很多人在c++并查集知識點有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”c++并查集知識點有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

并查集是一種樹型的數據結構,用于處理一些不交集的合并及查詢問題。

有一個聯合- 查找算法定義了兩個用于此數據結構的操作:

Find :確定元素屬于哪一個子集。它可以被用來確定兩個元素是否屬于同一子集。  Union:將兩個子集合并成同一個集合。

并查集主要運用在合并元素以及查詢兩個元素是否在同一集合的問題,在信息學競賽中廣泛涉及

初始化:

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

2、find函數:find(a)是用來查找a的“祖先”的,例如,我們要查找 a的祖先,就要去找a 的父親的父親……,直到有個人 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函數:find(a)是用來查找a的“祖先”的,例如,我們要查找 a的祖先,就要去找a 的父親的父親……,直到有個人 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函數:

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

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

代碼如下:

void Union (int a,int b)//因為union是c++的保留字,所以只好大寫u{  int u= find(a), v= find(b);//尋找a,b的祖先  f[u]=v;//合并家族}Union (a,b);

在合并的時候還有一個注意點:為什么不能直接把 a的父親指向 b?因為這樣并不能合并完全,a的父親,a 的父親的父親……,都不能合并到b 的家族里(想一想,為什么?),如圖

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

例題:

至此,你應該對并查集有了初步的了解,是時候上例題了

題目描述

如題,現在有一個并查集,你需要完成合并和查詢操作。

輸入輸出格式

輸入格式:

第一行包含兩個整數N、M,表示共有N個元素和M個操作。

接下來M行,每行包含三個整數Zi、Xi、Yi

當Zi=1時,將Xi與Yi所在的集合合并

當Zi=2時,輸出Xi與Yi是否在同一集合內,是的話輸出Y;否則話輸出N

輸出格式:

如上,對于每一個Zi=2的操作,都有一行輸出,每行包含一個大寫字母,為Y或者N

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

并查集的路徑壓縮

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

因為我們每次find(a) 都要消耗 O (a的層數) 的時間,如果數據構造成一條鏈,則每次find 都需要O(n) 的時間,這是我們不希望看到的

所以,我們可以把 f 數組的性質改變一下 f[a] 指向的編號變為a 的祖先

代碼該怎么寫呢?我們只需要在 find 函數里把

return find (f[x]);

變成

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

就可以了

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

到此,關于“c++并查集知識點有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

泸州市| 涟水县| 松原市| 濮阳市| 商洛市| 富川| 盖州市| 黄石市| 江安县| 银川市| 开远市| 北流市| 伊川县| 大化| 鹤壁市| 靖州| 阳江市| 游戏| 余干县| 泉州市| 巴马| 蒙山县| 和田市| 吉林省| 巧家县| 山阴县| 大足县| 阿合奇县| 怀化市| 工布江达县| 莱芜市| 峨眉山市| 融水| 留坝县| 尉犁县| 天祝| 聊城市| 临朐县| 沙田区| 泸水县| 南川市|