BZOJ 2115:[Wc2011]コーラス

\(nは1 \)任意のパスとの排他的論理和環上に作製することができる、図1の複数の\(nは1 \ \) XOR経路得
DFSは、すべてのリングを取得する取得線形グループは、貪欲低ビットXOR最大と

#include <bits/stdc++.h>
#define ll long long
#define P pair<int, ll>
#define pb push_back
using namespace std;

template<typename T>
inline void read(T &x) {
    x = 0;T f = 1; char ch = getchar();
    while (ch < '0' || ch > '9') { if (ch == '-') f = -1; ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = x * 10 + ch - 48; ch = getchar(); }
    x *= f;
}

const int N = 5e4 + 10;
vector<P> G[N];
ll dis[N], d[N * 100], p[N];
int n, m, cnt;
bool vis[N];

void dfs(int u) {
    vis[u] = 1;
    for (int i = 0; i < G[u].size(); i++) {
        P pp = G[u][i];
        int v = pp.first; ll c = pp.second;
        if (!vis[v]) dis[v] = dis[u] ^ c, dfs(v);
        else d[++cnt] = dis[v] ^ dis[u] ^ c;
    }
}

int main() {
    read(n); read(m);
    while (m--) {
        int u, v; ll c;
        read(u); read(v); read(c);
        G[u].pb((P){v, c});
        G[v].pb((P){u, c});
    }
    dfs(1);
    ll ans = dis[n];
    for (int i = 1; i <= cnt; i++) {
        for (int j = 61; ~j; j--) {
            if (d[i] >> j & 1) {
                if (!p[j]) { p[j] = d[i]; break; }
                d[i] ^= p[j];
            }
        }
    }
    for (int j = 61; ~j; j--) {
        if ((ans ^ p[j]) > ans) ans ^= p[j];
    }
    printf("%lld\n", ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/Mrzdtz220/p/12335356.html