洛谷P3367 模板 並查集

2021-09-12 08:33:21 字數 1947 閱讀 6551

如題,現在有乙個並查集,你需要完成合併和查詢操作。

第一行包含兩個整數n、m,表示共有n個元素和m個操作。

接下來m行,每行包含三個整數zi、xi、yi

當zi=1時,將xi與yi所在的集合合併

當zi=2時,輸出xi與yi是否在同一集合內,是的話輸出y;否則話輸出n

如上,對於每乙個zi=2的操作,都有一行輸出,每行包含乙個大寫字母,為y或者n

洛谷有很多模板題,掌握模板題很重要,對於演算法來說,如果你連演算法的模板都寫不出來,又怎麼去解題嗎?

首先我們先來了解一下什麼是並查集?

並查集是一種用於分離集合操作的抽象資料型別,這是從某本書上面找的,是的,看著就很抽象。

簡單來說,並查集就是對乙個集合裡面的元素進行某些元素的合併,然後需要在這些元素裡面查詢某幾個元素是否在同乙個集合裡面,大概就是這樣。

那麼我們來說說並查集常用到的兩個操作:合併,查詢。

4.1.1、 合併

現在陣列arr中有6個元素,分別是1、2、3、4、5、6,我們來對這些資料進行合併:

合併1和2

合併3和4

合併3和5

並查集就是通過這樣的合併,來將元素合併在同乙個集合中。

合併操作**如下

void unions(int y1,int y2)
4.1.2、查詢

現在我們要在已經合併後的大集合中查詢某幾個元素

查詢4,5

我們在arr集合中查詢元素4和元素5,判斷他們是否在同乙個集合中,經查詢後發現,他們的父結點都是3,所以他們在同一陣營。

查詢2,4

我們可以發現元素2的父結點是1,元素4的父結點的3,1和3不在同一集合,所以2和4也就不在同一集合了。

查詢操作**如下

int find(int x)

return x;

}

有了上面這些知識後,我們來解這道題就很簡單了,我就直接上**了

#include using namespace std;

const int maxn1 = 10005;

const int maxn2 = 200005;

int arr[maxn1];

struct nodeoper[maxn2];

int find(int root)

while(son != root)

return root;

}void unions(int root1, int root2)

}bool judge(int root1, int root2)

return flag;

}int main()

for(int i = 1; i <= m; i ++)

bool flag = false;

for(int i = 1; i <= m; i ++)else

}else}}

並查集模板 洛谷P3367

並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。集就是讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。初始化 把每個點所在集合初始化為其自身。通常來說,這個步驟在每次使用該資料結構時只需要執...

洛谷P3367 模板 並查集

如題,現在有乙個並查集,你需要完成合併和查詢操作。輸入格式 第一行包含兩個整數n m,表示共有n個元素和m個操作。接下來m行,每行包含三個整數zi xi yi 當zi 1時,將xi與yi所在的集合合併 當zi 2時,輸出xi與yi是否在同一集合內,是的話輸出y 否則話輸出n 輸出格式 如上,對於每乙...

洛谷 P3367 模板 並查集

如題,現在有乙個並查集,你需要完成合併和查詢操作。輸入格式 第一行包含兩個整數n m,表示共有n個元素和m個操作。接下來m行,每行包含三個整數zi xi yi 當zi 1時,將xi與yi所在的集合合併 當zi 2時,輸出xi與yi是否在同一集合內,是的話輸出y 否則話輸出n 輸出格式 如上,對於每乙...