Skip to content

M27306: 植物观察

disjoint set, bfs, http://cs101.openjudge.cn/practice/27306/

思路:典型二分图判断

cpp
#include <iostream>
#include <vector>
using namespace std;

const int MAX_N = 105;  
int parent[MAX_N];     
int relation[MAX_N];    
void init(int n) {
    for (int i = 0; i < n; ++i) {
        parent[i] = i;  
        relation[i] = 0; 
    }
}
int find(int x) {
    if (parent[x] != x) {
        int origin_parent = parent[x];
        parent[x] = find(parent[x]); 
        relation[x] ^= relation[origin_parent];
    }
    return parent[x];
}

int main() {
    int n, m;
    cin >> n >> m;
    init(n);
    bool possible = true;  
    for (int i = 0; i < m; ++i) {
        int a, b, op;
        cin >> a >> b >> op;
        int root_a = find(a);
        int root_b = find(b);
        if (root_a == root_b) {
            if ((relation[a] ^ relation[b]) != op) {
                possible = false;
            }
        } else {
            parent[root_b] = root_a;
            relation[root_b] = relation[a] ^ relation[b] ^ op;
        }
    }
    cout << (possible ? "YES" : "NO") << endl;
    return 0;
}