求助巨佬!这是一份只有30pts的代码!
查看原帖
求助巨佬!这是一份只有30pts的代码!
84987
LJY_ljy楼主2020/8/19 11:41

RT,离散化和并查集合在一起就不会写了……(本质上还是太菜了呀,普及难度的题目都不会写了)。

#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
#define MAXN 1000010
#define ZZ register int
using namespace std;

struct a {
    int x, y, e;
} require[MAXN];

map<int, int> mp;
int T, N, cnt, fa[MAXN], order[MAXN], num[MAXN << 1];

inline int read() {
    ZZ x = 0, f = 1;
    char ch = getchar();
    while (!isdigit(ch)) {
        if (ch == '-') f = -1;
        ch = getchar();
    }
    while (isdigit(ch)) {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}

inline void init() {
    N = read();
    memset(num, 0, sizeof(num));
    memset(fa, 0, sizeof(fa));
    memset(order, 0, sizeof(order));
    mp.clear();
    for (ZZ i = 1; i <= N; i++) {
        require[i].x = read(); require[i].y = read(); require[i].e = read();
        num[++cnt] = require[i].x; num[++cnt] = require[i].y;
    }
    sort(num, num + cnt);
    ZZ m = unique(num, num + cnt) - num;
    for (ZZ i = 0; i < m; i++)
        mp[num[i]] = i + 1;
    for (ZZ i = 0; i < cnt; i++)
        fa[i] = i;
}

inline int find(int x) {
    if (x == fa[x]) return x;
    return fa[x] = find(fa[x]);
}

inline void unite(int x, int y) {
    x = find(x); y = find(y);
    if (x == y) return;
    fa[y] = x;
}

inline bool same(int x, int y) {
    return find(x) == find(y);
}

int main() {
    T = read();
    while (T--) {
        init();
        bool flag = true;
        for (ZZ i = 1; i <= N; i++) {
            if (require[i].e == 1)
                unite(mp[require[i].x], mp[require[i].y]);
            else if (require[i].e == 0) {
                if (same(mp[require[i].x], mp[require[i].y])) {
                    flag = false;
                    break;
                }
            }
        }
        if (flag) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

2020/8/19 11:41
加载中...