并查集 C++版本 Python版本

AcWing 836. 合并集合         https://www.acwing.com/problem/content/838/

一共有n个数,编号是1~n,最开始每个数各自在一个集合中。

现在要进行m个操作,操作共有两种:

  1. “M a b”,将编号为a和b的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;
  2. “Q a b”,询问编号为a和b的两个数是否在同一个集合中;

输入格式

第一行输入整数n和m。

接下来m行,每行包含一个操作指令,指令为“M a b”或“Q a b”中的一种。

输出格式

对于每个询问指令”Q a b”,都要输出一个结果,如果a和b在同一集合内,则输出“Yes”,否则输出“No”。

每个结果占一行。

数据范围

1n,m1051≤n,m≤105

输入样例:

4 5
M 1 2
M 3 4
Q 1 2
Q 1 3
Q 3 4

输出样例:

Yes
No
Yes




#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 1e5+5;

int p[N];

int finding(int x)
{
    if(p[x] != x)   p[x] = finding(p[x]);
    return p[x];
}


int main()
{

    int n, m;
    cin >> n >> m;
    for(int i = 1; i <= n; ++ i)
        p[i] = i;
    while(m --)
    {
        char op[2];
        int a, b;
        scanf("%s%d%d", op, &a, &b);
        if(*op == 'M')
            p[finding(a)] = finding(b);
        else
        {
            if(finding(a) == finding(b))
                printf("Yes\n");
            else
                printf("No\n");
        }
    }
    return 0;
}
n, m = map(int, input().split())
p = [i for i in range(n+5)]


def find(x):
    if p[x] != x:
        p[x] = find(p[x])
    return p[x]


while m:
    m -= 1
    t = input().split()
    op = t[0]
    a = int(t[1])
    b = int(t[2])
    if op == "M":
        p[find(a)] = find(b)
    else:
        if find(a) == find(b):
            print("Yes")
        else:
            print("No")

猜你喜欢

转载自www.cnblogs.com/Chaosliang/p/12233076.html
今日推荐