AcWing 836 合併集合

2021-10-16 23:11:39 字數 746 閱讀 3948

並查集(功能):

1.將兩個集合合併;

2.詢問兩個元素是否在同乙個集合中;

基本原理:

1.每個集合用一棵樹表示,樹根的編號就是集合的編號;

2.每個節點儲存它的父節點, fa[x]表示x的父節點;

問題:

q1:如何判斷樹根?

a1:if(p[x] == x)

q2:如何求x的集合編號?

a2:while(p[x] != x) x=p[x];

q3:如何合併兩個集合?

a3:p[x]是x的集合編號,p[y]是y的集合編號,p[p[x]]=y;

優化

每個節點都都指向根節點,路徑壓縮

題解

#include

using

namespace std;

const

int n =

1e5+10;

int n, m;

//點的數量和操作的數量

int fa[n]

;//存每個元素的父節點是誰

intfind

(int x)

//返回集合所在x的編號/x的祖宗節點 + 路徑壓縮

intmain()

}return0;

}

AcWing 836 合併集合

題目描述 一共有n個數,編號是1 n,最開始每個數各自在乙個集合中。現在要進行m個操作,操作共有兩種 m a b 將編號為a和b的兩個數所在的集合合併,如果兩個數已經在同乙個集合中,則忽略這個操作 q a b 詢問編號為a和b的兩個數是否在同乙個集合中 輸入格式 第一行輸入整數n和m。接下來m行,每...

ACWing 836 合併集合

一共有n nn個數,編號1 n 1 sim n 1 n,最開始每個數各自在乙個集合中。現在進行m mm次操作,每次 1 m a b 將編號為a aa和b bb的兩個數所在的集合合併,如果兩個數已經在同乙個集合中,則忽略這個操作 2 q a b 詢問編號為a aa和b bb的兩個數是否在同乙個集合中 ...

AcWing 836 合併集合

一共有n個數,編號是1 n,最開始每個數各自在乙個集合中。現在要進行m個操作,操作共有兩種 第一行輸入整數n和m。接下來m行,每行包含乙個操作指令,指令為 m a b 或 q a b 中的一種。對於每個詢問指令 q a b 都要輸出乙個結果,如果a和b在同一集合內,則輸出 yes 否則輸出 no 每...