地址 https://www.acwing.com/problem/content/838/ios
一共有n個數,編號是1~n,最開始每一個數各自在一個集合中。spa
如今要進行m個操做,操做共有兩種:code
第一行輸入整數n和m。xml
接下來m行,每行包含一個操做指令,指令爲「M a b」或「Q a b」中的一種。blog
對於每一個詢問指令」Q a b」,都要輸出一個結果,若是a和b在同一集合內,則輸出「Yes」,不然輸出「No」。ci
每一個結果佔一行。get
1≤n,m≤1051≤n,m≤105io
輸入樣例: 4 5 M 1 2 M 3 4 Q 1 2 Q 1 3 Q 3 4 輸出樣例: Yes No Yes
並查集 模板題目模板
解答 class
#include <iostream> using namespace std; const int N = 100010; int arr[N] = {-1}; int find(int n){ if(arr[n] != n) arr[n] = find(arr[n]); return arr[n]; } int main() { int n,m; cin >> n >> m; for (int i = 1; i <= n; i ++ ) arr[i] = i; while(m--){ char op[2]; int a, b; scanf("%s%d%d", op, &a, &b); if (*op == 'M') arr[find(a)] = find(b); else { if (find(a) == find(b)) puts("Yes"); else puts("No"); } } return 0; }