码迷,mamicode.com
首页 > 其他好文 > 详细

P4151 最大XOR和路径 线性基

时间:2019-07-22 23:51:57      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:最大   scan   col   cstring   bool   define   false   ext   tps   

题解见: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和路径 线性基

标签:最大   scan   col   cstring   bool   define   false   ext   tps   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!