一共有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≤105
輸入樣例:
4 5m 1 2
m 3 4
q 1 2
q 1 3
q 3 4
輸出樣例:
yesno
yes基本原理:每個集合用乙個樹來表示。樹根的編號就是整個集合的編號。每個節點儲存它的父節點,p[x]表示x的父節點。
#include
using
namespace std;
const
int n =
100010
;int p[n]
;//用來表示父節點
intfind
(int x)
//找到x的祖宗節點+ 將x路徑上所有點的父節點變為祖宗節點
intmain()
}return0;
}來自acwing
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 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的兩個數是否在同乙個集合中 ...