演算法基礎之資料結構 並查集

2021-10-22 17:01:36 字數 1091 閱讀 7548

題目:合併計算

一共有 n 個數,編號是 1∼n,最開始每個數各自在乙個集合中。

現在要進行 m 個操作,操作共有兩種:

m a b,將編號為 a 和 b 的兩個數所在的集合合併,如果兩個數已經在同乙個集合中,則忽略這個操作;

q a b,詢問編號為 a 和 b 的兩個數是否在同乙個集合中;

輸入格式

第一行輸入整數 n 和 m。

接下來 m 行,每行包含乙個操作指令,指令為 m a b 或 q a b 中的一種。

輸出格式

對於每個詢問指令 q a b,都要輸出乙個結果,如果 a 和 b 在同一集合內,則輸出 yes,否則輸出 no。

每個結果佔一行。

資料範圍

1≤n,m≤10^5

輸入樣例:

4 5m 1 2

m 3 4

q 1 2

q 1 3

q 3 4

輸出樣例:

yesno

yes思想:

可以用並查集來解決這道題目。輸入的數字n表示起始有多少個集合,用乙個陣列p可以儲存每乙個數字處在哪乙個集合,如果命令是m那麼就合併這兩個集合,是q的話就查詢這兩個數字是不是在同乙個集合裡面,思想很簡單。

合併的思想可以模仿樹,如果要合併那麼先找到它們所處的根節點位置,然後讓其中的乙個根節點等於另乙個根節點,那麼就相當於合併了。

**如下:

#include

using

namespace std;

const

int n =

100005

;int p[n]

;int

find

(int x)

voidm(

int a,

int b)

intmain()

}}

演算法簡述 基礎資料結構 並查集

列題解析 並查集也是用來維護集合的,和前面學習的 set 不同之處在於,並查集能很方便地同時維護很多集 合。如果用 set 來維護會非常的麻煩。並查集的核心思想是記錄每個結點的父親結點是哪個結點。然而可以知道,這樣空間時間複雜度極高,無法通過題目的時限.void init int get int x...

資料結構與演算法之並查集

並查集結構可以用於 1 檢查兩個元素是否屬於同乙個集合 比如對於圖1這個例子來說,如果我們想要檢查節點d和節點e是否屬於同乙個集合,可以這樣操作 d節點往上找其父節點,一直往上找,直到某個節點的父節點是其本身,此時停止 找到了節點a e節點也按照相同的步驟往上找其父節點,找到節點a 如果這兩個節點往...

資料結構與演算法之並查集

並查集 union find 是一種高效的資料結構,主要的操作有 為方便敘述,把所有元素視作點,元素之間的關係視作線,存在聯絡便存在關係 需要注意的是,這裡的關係應當是1.自反的,2.對稱的,3.傳遞的 所謂合併,便是將兩個點之間 畫 一條線。又上邊的定義不難理解相連的若干點之間互相存在關係,這樣我...