国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

圖論:并查集的合并、判斷和求節(jié)點(diǎn)

這篇具有很好參考價(jià)值的文章主要介紹了圖論:并查集的合并、判斷和求節(jié)點(diǎn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

圖論:并查集的合并、判斷和求節(jié)點(diǎn),ACM2024寒假集訓(xùn),圖論,算法,c++,數(shù)據(jù)結(jié)構(gòu)

?所謂并查集就是可以畫圖理解

假如說(shuō)我們想要構(gòu)建一個(gè)樹(也是圖),要求1->2,2->4,1->3

在構(gòu)另一個(gè)樹,要求5->6,6->7,5->8

圖論:并查集的合并、判斷和求節(jié)點(diǎn),ACM2024寒假集訓(xùn),圖論,算法,c++,數(shù)據(jù)結(jié)構(gòu)

1是2的頭結(jié)點(diǎn),2是4的頭結(jié)點(diǎn),以此類推

下面要求去將5連接到1上,就是我下面要講的,其實(shí)上面的子節(jié)點(diǎn)的連接也是如此的。

簡(jiǎn)單并查集例題:

一共有 n 個(gè)數(shù),編號(hào)是 1~n,最開始每個(gè)數(shù)各自在一個(gè)集合中。

現(xiàn)在要進(jìn)行 m 個(gè)操作,操作共有兩種:

  1. M a b,將編號(hào)為 a 和 b 的兩個(gè)數(shù)所在的集合合并,如果兩個(gè)數(shù)已經(jīng)在同一個(gè)集合中,則忽略這個(gè)操作;
  2. Q a b,詢問(wèn)編號(hào)為 a 和 b 的兩個(gè)數(shù)是否在同一個(gè)集合中;
輸入格式

第一行輸入整數(shù) n 和 m。

接下來(lái) m 行,每行包含一個(gè)操作指令,指令為 M a b 或 Q a b 中的一種。

輸出格式

對(duì)于每個(gè)詢問(wèn)指令 Q a b,都要輸出一個(gè)結(jié)果,如果 a 和 b 在同一集合內(nèi),則輸出 Yes,否則輸出 No。

每個(gè)結(jié)果占一行。

分析一下:

面對(duì)這種比較新的數(shù)據(jù)結(jié)構(gòu)一般都是非常抽象的,但是一旦通過(guò)畫圖或者推理理解了,也就很容易記住了,首先我們將p[i]=i,為的是存儲(chǔ)此樹的頭結(jié)點(diǎn),接下來(lái)要進(jìn)行連接的操作,就要通過(guò)find(),壓縮一下路徑。將子節(jié)點(diǎn)連接到p[b]=find(p[a])(a為子節(jié)點(diǎn),b為父節(jié)點(diǎn)),下面都是這種操作。

然后這個(gè)題目他讓判斷是不是在一個(gè)集合就可以find(a)==find(b)來(lái)判斷是不是頭結(jié)點(diǎn)一樣,因?yàn)樽罱Kfind(a)返回的是頭結(jié)點(diǎn)的值。

代碼實(shí)現(xiàn):
 #include<bits/stdc++.h>
 using namespace std;
 const int N=1e5+10;
 int p[N];
 int find(int x){//返回x的祖宗節(jié)點(diǎn)+路徑壓縮
    if(p[x]!=x)p[x]=find(p[x]);//只有祖宗節(jié)點(diǎn)才有p[x]=x
    return p[x];
 }
 int n,m;
 signed main(){
     scanf("%d%d",&n,&m);
      for(int i=1;i<=n;i++)p[i]=i;
      for(int i=1;i<=m;i++){
         char op[2];//讀字符串比讀字符更省事
         int a,b;
         scanf("%s%d%d",op,&a,&b);
         if(*op=='M')p[find(a)]=find(b);
         else {
             if(find(a)==find(b))printf("Yes\n");
             else printf("No\n");
         }
      }
 }

下面還有一類題目:讓求一個(gè)樹里面有多少子節(jié)點(diǎn)

給定一個(gè)包含?n?個(gè)點(diǎn)(編號(hào)為?1~n)的無(wú)向圖,初始時(shí)圖中沒(méi)有邊。

現(xiàn)在要進(jìn)行?m?個(gè)操作,操作共有三種:

  1. C a b,在點(diǎn)?a?和點(diǎn)?b?之間連一條邊,a?和?b?可能相等;
  2. Q1 a b,詢問(wèn)點(diǎn)?a?和點(diǎn)?b?是否在同一個(gè)連通塊中,a?和?b?可能相等;
  3. Q2 a,詢問(wèn)點(diǎn)?a?所在連通塊中點(diǎn)的數(shù)量;
輸入格式

第一行輸入整數(shù)?n?和?m。

接下來(lái)?m?行,每行包含一個(gè)操作指令,指令為?C a b,Q1 a b?或?Q2 a?中的一種。

輸出格式

對(duì)于每個(gè)詢問(wèn)指令?Q1 a b,如果?a和?b在同一個(gè)連通塊中,則輸出?Yes,否則輸出?No。

對(duì)于每個(gè)詢問(wèn)指令?Q2 a,輸出一個(gè)整數(shù)表示點(diǎn)?a 所在連通塊中點(diǎn)的數(shù)量

每個(gè)結(jié)果占一行。

數(shù)據(jù)范圍

1≤n,m≤10^5

輸入樣例:
5 5
C 1 2
Q1 1 2
Q2 1
C 2 5
Q2 5
輸出樣例:
Yes
2
3
分析過(guò)程:

?這個(gè)題的求節(jié)點(diǎn)數(shù),只用拿個(gè)數(shù)組將所有的子節(jié)點(diǎn)連接過(guò)程一一地加到父節(jié)點(diǎn)的si[b](b為父節(jié)點(diǎn)),最后輸出的是si[find(a)](a為樹中任意一個(gè)數(shù))。這樣我們就求到了樹的節(jié)點(diǎn)數(shù)。

但是別忘記初始化為si[i]=1,不是si[i]=i

代碼實(shí)現(xiàn):
#include<bits/stdc++.h>
#define read(x) scanf("%d",&x)
using namespace std;
const int N = 1e5+5;
int n,m,a,b,fa[N], si[N];
string act;

void init() {//初始化
    for (int i=1; i<=n; i++) {
        fa[i] = i;
        si[i] = 1;
    }
}

int find(int x) {//查找父節(jié)點(diǎn)
    if(fa[x]==x) return x;
    else return fa[x] = find(fa[x]);
}

void merge(int a,int b) {//節(jié)點(diǎn)數(shù)加起來(lái)
    int x = find(a);
    int y = find(b);
    fa[x] = y;
    si[y] += si[x];
}

bool ask(int a,int b) {//詢問(wèn)是不是頭結(jié)點(diǎn)一樣
    return find(a)==find(b);
}

int main() {
    read(n),read(m);
    init();
    while(m--) {
        cin>>act;
        if(act=="C") {
            read(a),read(b);
            if(!ask(a,b)) merge(a,b);
        } else if(act=="Q1") {
            read(a),read(b);
            ask(a,b) ? printf("Yes\n") : printf("No\n");
        } else {
            read(a);
            printf("%d\n",si[find(a)]);
        }
    }   
    return 0;
}

以上就是并查集這一種數(shù)據(jù)結(jié)構(gòu)的代碼思路和方法了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-801040.html

到了這里,關(guān)于圖論:并查集的合并、判斷和求節(jié)點(diǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 圖論基礎(chǔ)知識(shí) 并查集/例題

    學(xué)習(xí)記錄自代碼隨想錄 并查集常用來(lái)解決連通性問(wèn)題。 判斷兩個(gè)元素是否在同一個(gè)集合里的時(shí)候,要想到用并查集。 并查集主要有兩個(gè)功能: 1.將兩個(gè)元素添加到一個(gè)集合中; 2.判斷兩個(gè)元素在不在同一個(gè)集合。 例題:20240410 Huawei機(jī)考

    2024年04月25日
    瀏覽(21)
  • 【算法日志】圖論 并查集及其簡(jiǎn)單應(yīng)用

    并查集是一種算法設(shè)計(jì)思想,通過(guò)判斷兩個(gè)元素是否在同一個(gè)集合里,常用來(lái)解決一些和圖相關(guān)的連通性問(wèn)題。 并查集主要有以下兩個(gè)功能: 將兩個(gè)元素添加到一個(gè)集合中。 判斷兩個(gè)元素是否是在一個(gè)集合之中(這一功能夠有效判斷是否成環(huán))。 主要思想: 通過(guò)創(chuàng)建一個(gè)數(shù)組

    2024年01月23日
    瀏覽(16)
  • ?算法進(jìn)階?圖論::并查集——快速理解到熟練運(yùn)用

    ?算法進(jìn)階?圖論::并查集——快速理解到熟練運(yùn)用

    目錄 ?一、原理 1. 初始化Init ? 2. 查詢 find? 3. 合并 union 二、代碼模板 三、練習(xí) 1、? 990.等式方程的可滿足性?? 2、? 1061.?按字典序排列最小的等效字符串?? 3、721.賬戶合并??? 4、? 839.相似字符串組?? 5、? 2812.找出最安全路徑??? 并查集主要運(yùn)用與求一些 不相交且有關(guān)

    2024年02月13日
    瀏覽(26)
  • C++:合并集合(并查集)

    一共有n個(gè)數(shù),編號(hào)是1~n,最開始每個(gè)數(shù)各自在一個(gè)集合中。 現(xiàn)在要進(jìn)行m個(gè)操作,操作共有2種: 1.“M a b”,將編號(hào)為a和b的兩個(gè)數(shù)的所在的集合合并,如果兩個(gè)數(shù)已經(jīng)在同一個(gè)集合中則忽略這個(gè)操作 2.“Q a b”,詢問(wèn)編號(hào)為a和b的兩個(gè)數(shù)是否在同一個(gè)集合中 第一行輸入整數(shù)

    2024年02月13日
    瀏覽(20)
  • 代碼隨想錄圖論并查集 第七天 | 685.冗余連接II

    代碼隨想錄圖論并查集 第七天 | 685.冗余連接II 一、685.冗余連接II 題目鏈接:https://leetcode.cn/problems/redundant-connection-ii/ 思路:684.冗余連接中是連通且無(wú)環(huán)的無(wú)向圖可直接使用并查集模板,如果想判斷集合中是否有環(huán),且那條邊構(gòu)成環(huán),只需要每次加入并查集之前先判斷一下是

    2024年02月06日
    瀏覽(25)
  • 并查集模板-兩個(gè)操作:合并集合和查詢兩個(gè)元素是否屬于同一個(gè)集合

    并查集模板-兩個(gè)操作:合并集合和查詢兩個(gè)元素是否屬于同一個(gè)集合

    836. 合并集合 一共有?nn?個(gè)數(shù),編號(hào)是? 1~n 1~n,最開始每個(gè)數(shù)各自在一個(gè)集合中。 現(xiàn)在要進(jìn)行?mm?個(gè)操作, 操作共有兩種 : M a b ,將編號(hào)為?aa?和?bb?的 兩個(gè)數(shù)所在的集合合并 ,如果兩個(gè)數(shù)已經(jīng)在同一個(gè)集合中,則忽略這個(gè)操作; Q a b , 詢問(wèn)編號(hào)為?aa?和?bb?的兩個(gè)

    2024年02月13日
    瀏覽(89)
  • 【算法每日一練]-圖論(保姆級(jí)教程篇7 最小生成樹 ,并查集模板篇)#村村通 #最小生成樹

    【算法每日一練]-圖論(保姆級(jí)教程篇7 最小生成樹 ,并查集模板篇)#村村通 #最小生成樹

    目錄 題目:村村通 并查集? 題目:最小生成樹 kruskal算法 prim算法 ???????? 先引入問(wèn)題: 要在n個(gè)城市之間鋪設(shè)光纜,主要目標(biāo)是要使這 n 個(gè)城市的 任意兩個(gè)之間都可以通信 ,但鋪設(shè)光纜的費(fèi)用很高,且各個(gè)城市之間鋪設(shè)光纜的費(fèi)用不同,因此另一個(gè)目標(biāo)是要 使鋪設(shè)光

    2024年02月04日
    瀏覽(22)
  • 并查集(種類并查集,帶權(quán)并查集)

    鏈接:登錄—專業(yè)IT筆試面試備考平臺(tái)_牛客網(wǎng) 來(lái)源:??途W(wǎng) ? 動(dòng)物王國(guó)中有三類動(dòng)物A,B,C,這三類動(dòng)物的食物鏈構(gòu)成了有趣的環(huán)形。A吃B,B吃C,C吃A。 現(xiàn)有N個(gè)動(dòng)物,以1-N編號(hào)。每個(gè)動(dòng)物都是A,B,C中的一種,但是我們并不知道它到底是哪一種。 有人用兩種說(shuō)法對(duì)這N個(gè)動(dòng)物所

    2024年02月11日
    瀏覽(25)
  • 12.25~12.27并查集(查找與合并),全排列,約瑟夫問(wèn)題(隊(duì)列,數(shù)組)upper/lower_bound,重構(gòu)二叉樹,最優(yōu)矩陣,線段樹(構(gòu)建),淘汰賽(構(gòu)建樹,隊(duì)列),醫(yī)院?jiǎn)栴}(最短路,弗洛伊德

    12.25~12.27并查集(查找與合并),全排列,約瑟夫問(wèn)題(隊(duì)列,數(shù)組)upper/lower_bound,重構(gòu)二叉樹,最優(yōu)矩陣,線段樹(構(gòu)建),淘汰賽(構(gòu)建樹,隊(duì)列),醫(yī)院?jiǎn)栴}(最短路,弗洛伊德

    題目背景 若某個(gè)家族人員過(guò)于龐大,要判斷兩個(gè)是否是親戚,確實(shí)還很不容易,現(xiàn)在給出某個(gè)親戚關(guān)系圖,求任意給出的兩個(gè)人是否具有親戚關(guān)系。 題目描述 規(guī)定:?x?和??y?是親戚,?y?和??z?是親戚,那么??x?和??z?也是親戚。如果??x,?y?是親戚,那么??

    2024年01月23日
    瀏覽(20)
  • 【藍(lán)橋模板】——如何用7行代碼,優(yōu)雅地拿捏并查集?(并查集模板)

    【藍(lán)橋模板】——如何用7行代碼,優(yōu)雅地拿捏并查集?(并查集模板)

    全文目錄?? ????????并查集-親戚問(wèn)題 ??傳送錨點(diǎn)? ???思路點(diǎn)撥 ??代碼詳解?? ????并查集-藍(lán)橋幼兒園 ??傳送錨點(diǎn) ???思路點(diǎn)撥 ??代碼詳解?? ??并查集-合根植物 ??傳送錨點(diǎn) ???思路點(diǎn)撥 ??代碼詳解?? ???并查集-城邦 ??傳送錨點(diǎn)??????? ???思

    2023年04月09日
    瀏覽(17)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包