首页 > 其他 > 详细

P4151 最大XOR和路径 线性基

时间:2019-07-23 00:58:16      阅读:96      评论:0      收藏:0      [点我收藏+]

题解见:https://www.luogu.org/problemnew/solution/P4151

其实就是找出所有环 把环上所有边异或起来得到的值扔到线性基里面

然后随便走一条从1~n的链 最后求最大异或和即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define LL long long
LL num[70];
bool insert(LL x) {
        for (int i = 63; i >= 0; i--)
                if ((x >> i) & 1) {
                        if (!num[i]) {
                                num[i] = x;
                                return true;
                        }
                        x ^= num[i];
                }
        return false;
}
LL query(LL x) {
        LL res = x;
        for (int i = 63; i >= 0; i--)
                if ((res ^ num[i]) > res)
                        res ^= num[i];
        return res;
}
struct edge {
        int to, next;
        LL w;
} e[200010];
int head[50010], ecnt;
inline void adde(int from, int to, LL w) {
        e[++ecnt] = (edge) {to, head[from], w}, head[from] = ecnt;
        e[++ecnt] = (edge) {from, head[to], w}, head[to] = ecnt;
}
int vis[50010];
LL del[50010];
void dfs(int u, LL res) {
        del[u] = res, vis[u] = 1;
        for (int i = head[u]; i; i = e[i].next)
                if (!vis[e[i].to])
                        dfs(e[i].to, res ^ e[i].w);
                else
                        insert(res ^ e[i].w ^ del[e[i].to]);
}
int main() {
        int n, m, a, b;
        LL c;
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= m; i++)
                scanf("%d%d%lld", &a, &b, &c), adde(a, b, c);
        dfs(1, 0);
        printf("%lld\n", query(del[n]));
}

 

P4151 最大XOR和路径 线性基

原文:https://www.cnblogs.com/Aragaki/p/11229205.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!