并查集

一 ,并查集的構造

① 設定一個集合杨赤,叫并查集敞斋,即 Disjoint Set,功能是檢查 圖中 是否出現了 環(huán)
② 往集合里面添加邊疾牲,怎么添加呢植捎。取邊的起點和終點,判斷兩點是否都在集合里面阳柔,如果都在焰枢,則出現了環(huán),如果不在舌剂,將兩個點 放入集合中济锄。
③ 繼續(xù)添加下一條邊,如果沒有邊了霍转,還沒有找到環(huán)荐绝,就是沒有環(huán)了

二,數組以樹的形式實現

上面所講的就是基本的思想了避消,下面講如何具體實現

① 由于集合操作并不方便低滩,所以便設法使用數組實現

② 由于上面所說的添加邊 可以看成是一組點的集合 連接 另外一組點的集合,所以我們只要隨便讓集合的某一點 連接 另外一個集合的任意一點 就行了
這樣就可以讓所有點處于連通狀態(tài)

③ 基于上述所講岩喷,我們可以將點以樹的形式連接恕沫,為什么是樹呢?因為集合中沒有環(huán)纱意,所以最后畫出來的圖形就是樹了昏兆。

④ 由于連接的隨意性, 這種連接方式妇穴,并不能正確表示一張圖爬虱,只是能表示所有點是連接在一起的,且這種圖畫出來是樹的形式腾它。

⑤ 所以跑筝,我們可以構造一個 parent 數組,什么意思呢 瞒滴? 就是 parent[x]=y, 指 x 的父節(jié)點是 y ,

為什么要 定義一個父節(jié)點呢曲梗? 定義父節(jié)點的意思是 你可以通過父節(jié)點找到這個集合的根 赞警,根就是 所有點 都由 這個點 出發(fā)得到的。

那么虏两,為什么要找到這個根呢愧旦? 即這樣做的優(yōu)點。
優(yōu)點1定罢,在添加邊的時候笤虫,可以通過查找 邊上兩個點的根結點是否存在,是否相同祖凫,達到判斷兩個點是否在之前的集合中出現過的效果
優(yōu)點2琼蚯,可以在 加邊 時減少樹的深度,之后查找 根節(jié)點時就可以減少步驟

三惠况,壓縮路徑

且看我上面優(yōu)點 2 這一句 “但如果讓 3 的父節(jié)點為 0 深度增加了一層” 遭庶,其實如果但如果讓 0 的父節(jié)點為 3 深度就沒有增加了

之前的代碼中,我們這一步那個時那個的父節(jié)點我們并沒有對此做一個判斷稠屠,來判斷哪一個成為 父節(jié)點 樹的深度會更少峦睡。
這樣子就有一個問題,如果一直是
0-1 1-2 2-3 3-4 這樣子就會讓樹的深度一直增加权埠,這樣就會讓 find_root 函數時間復雜度在最壞的情況下達到 o(n) ,即每個點都要查找榨了。
所以,我們使用 rank 數組來記錄 樹的深度弊知,如 rank[x]=y 表示 以 x 點為根結點的話,樹的深度為 y
題目:
https://www.luogu.com.cn/problem/P1551

#include<iostream>
using namespace std;
int a[5001],rank[5001];
int n,m,p;
//n個人粱快,m個親戚關系秩彤,詢問p對親戚關系 
//尋找該點的最最最原始的結點,直到找到沒有父節(jié)點的0為止 
int find_root(int x,int a[]){
    //先將根節(jié)點設為自己 
    int x_root = x;
    //往上找事哭,如果不是0就繼續(xù) 
    while(a[x_root]){
        x_root = a[x_root];
    }
    //返回根節(jié)點 
    return x_root;
}
//合并 
int union_vertices(int x,int y,int a[],int rank[]){
    //找到x和y的根節(jié)點 
    int x_root = find_root(x,a);
    int y_root = find_root(y,a);
    //如果相同就不用并了漫雷,是一家人 
    if(x_root == y_root){
        return 0;
    }else{
        //a[x_root]=y_root;
        //如果x的層數比y的層數高,就把y并到x上鳍咱,總層數不變 
        if(rank[x_root] > rank[y_root]){
            a[y_root] = x_root;
        }else if(rank[y_root] > rank[x_root]){
            a[x_root] = y_root;
        }else{//如果層數相同降盹,就隨便并一下,層數加一 
            a[x_root] = y_root;
            rank[y_root]++; 
        }   
        return 1;
    }   
}

int main(){
    cin>>n>>m>>p;
    while(m--){
        int x,y;
        cin>>x>>y;
        union_vertices(x,y,a,rank);
    }
    while(p--){
        int x,y;
        cin>>x>>y;
        int x_root = find_root(x,a);
        int y_root = find_root(y,a);
        if(x_root == y_root){
            cout<<"Yes"<<endl;
        }else{
            cout<<"No"<<endl;
        }
    }
    return 0;
}

鏈接:
https://www.cnblogs.com/asdfknjhu/p/12515480.html
https://www.bilibili.com/video/BV13t411v7Fs

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末谤辜,一起剝皮案震驚了整個濱河市蓄坏,隨后出現的幾起案子,更是在濱河造成了極大的恐慌丑念,老刑警劉巖涡戳,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異脯倚,居然都是意外死亡渔彰,警方通過查閱死者的電腦和手機嵌屎,發(fā)現死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恍涂,“玉大人宝惰,你說我怎么就攤上這事≡俨祝” “怎么了尼夺?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長产园。 經常有香客問我汞斧,道長,這世上最難降的妖魔是什么什燕? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任粘勒,我火速辦了婚禮,結果婚禮上屎即,老公的妹妹穿的比我還像新娘庙睡。我一直安慰自己,他們只是感情好技俐,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布乘陪。 她就那樣靜靜地躺著,像睡著了一般雕擂。 火紅的嫁衣襯著肌膚如雪啡邑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天井赌,我揣著相機與錄音谤逼,去河邊找鬼。 笑死仇穗,一個胖子當著我的面吹牛流部,可吹牛的內容都是我干的。 我是一名探鬼主播纹坐,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼枝冀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耘子?” 一聲冷哼從身側響起果漾,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谷誓,沒想到半個月后跨晴,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡片林,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年端盆,在試婚紗的時候發(fā)現自己被綠了怀骤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡焕妙,死狀恐怖蒋伦,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情焚鹊,我是刑警寧澤痕届,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站末患,受9級特大地震影響研叫,放射性物質發(fā)生泄漏。R本人自食惡果不足惜璧针,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一嚷炉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧探橱,春花似錦申屹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胞枕,卻和暖如春杆煞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腐泻。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工决乎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贫悄。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓瑞驱,卻偏偏與公主長得像娘摔,于是被迫代替她去往敵國和親窄坦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容