ACWing 836 合併集合

2021-10-19 10:08:46 字數 1011 閱讀 9743

一共有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的兩個數是否在同乙個集合中;

輸入格式:

第一行輸入整數n

nn和m

mm。接下來m

mm行,每行包含乙個操作指令,指令為「m a b」或「q a b」中的一種。

輸出格式:

對於每個詢問指令」q a b」,都要輸出乙個結果,如果a

aa和b

bb在同一集合內,則輸出「yes」,否則輸出「no」。每個結果佔一行。

資料範圍:

1 ≤n

,m≤1

05

1\le n,m\le 10^5

1≤n,m≤

105可以用並查集。**如下:

#include

using

namespace std;

const

int n =

100010

;int p[n]

;void

init

(int n)

intfind

(int x)

// union是c++關鍵字。這裡用merge這個單詞即可

void

merge

(int x,

int y)

intmain()

return0;

}

每次操作時間複雜度o

(log⁡∗

n)

o(\log ^*n)

o(log∗n)

,空間是o(n

)o(n)

o(n)

AcWing 836 合併集合

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

AcWing 836 合併集合

並查集 功能 1.將兩個集合合併 2.詢問兩個元素是否在同乙個集合中 基本原理 1.每個集合用一棵樹表示,樹根的編號就是集合的編號 2.每個節點儲存它的父節點,fa x 表示x的父節點 問題 q1 如何判斷樹根?a1 if p x x q2 如何求x的集合編號?a2 while p x x x p ...

AcWing 836 合併集合

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