C11BC2 - Robin

Tác giả: RR

Ngôn ngữ: C++

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <iomanip>
#include <bitset>
#include <complex>

#define FOR(i,a,b) for(int i = a; i <= b; ++i)
#define FORD(i,a,b) for(int i = a; i >= b; --i)
#define REP(i,a) for(int i = 0; i < a; ++i)
#define MP make_pair
#define PB push_back

using namespace std;

int lab[10111];

int getRoot(int u) {
    if (lab[u] < 0) return u;
    return lab[u] = getRoot(lab[u]);
}

void merge(int u, int v) {
    if (u == v) return ;
    int x = lab[u] + lab[v];
    if (lab[u] < lab[v]) {
        lab[u] = x;
        lab[v] = u;
    }
    else {
        lab[v] = x;
        lab[u] = v;
    }
}

int main() {
    int n, m; scanf("%d%d", &n, &m);
    memset(lab, -1, sizeof lab);
    int v, k;
    FOR(u,2,n) {
        scanf("%d%d", &v, &k);
        if (k == 2) continue;
        merge(getRoot(u), getRoot(v));
    }
    int u;
    FOR(i,1,m) {
        scanf("%d%d", &u, &v);
        if (getRoot(u) != getRoot(v)) puts("YES");
        else puts("NO");
    }
    return 0;
}

Download