bzoj 2115 [Wc2011] Xor 路径最大异或和 线性基
题目链接
题意
给定一个 \(n(n\le 50000)\) 个点 \(m(m\le 100000)\) 条边的无向图,每条边上有一个权值。请你求一条从 \(1\)到\(n\)的路径,使得路径上的边的异或和最大。
题解
参考
https://blog.sengxian.com/algorithms/linear-basis
结论
答案=\(max_\{\)(某一条\(1\)到\(n\)的路径的异或和)\(\oplus\)(环\(i_1\)的异或和)\(\oplus\)(环\(i_2\)的异或和)...\(\}\)
构造性证明
我们证明,对于图中任意一个环,其异或和是可以取到的。
方法是从任意一个点\(u\)出发走到环上的某一点\(v\),绕一圈,然后再沿着\(v\)到\(u\)的路径原路返回,记路径\(u\rightarrow v\)的异或和为\(x_0\),环上的异或和为\(x_1\),则这一整段路的贡献即为\(x_0\oplus x_1\oplus x_0=x_1\),即为环上的异或和。
求值
现在的问题就转化为了,在线性基中取若干个向量,使得它们与某个初始给定值的异或和取到最大。
将向量从高位向低位逐个加入,使得和变大则加,否则不加,即可取到最大。
由线性基线性无关易见,对某一位的贡献只能来自于最多一个向量。
Code
#include <bits/stdc++.h>
#define maxn 200010
#define maxl 60
using namespace std;
typedef long long LL;
struct Edge { int to, ne; LL d; } edge[maxn<<1];
LL d[maxn], b[maxn];
int tot, ne[maxn], cnt;
bool vis[maxn];
void add(int u, int v, LL d) {
edge[tot] = {v, ne[u], d};
ne[u] = tot++;
edge[tot] = {u, ne[v], d};
ne[v] = tot++;
}
void dfs(int u, LL dd) {
d[u] = dd; vis[u] = true;
for (int i = ne[u]; ~i; i = edge[i].ne) {
int v = edge[i].to;
if (vis[v]) b[cnt++] = d[u] ^ edge[i].d ^ d[v];
else dfs(v, d[u] ^ edge[i].d);
}
}
struct LinearBasis {
LL a[maxl+1];
LinearBasis() { memset(a, 0, sizeof a); }
void insert(LL t) {
for (int i = maxl; i >= 0; --i) {
if (!(t >> i & 1)) continue;
if (a[i]) t ^= a[i];
else {
for (int j = 0; j < i; ++j) if (t >> j & 1) t ^= a[j];
for (int j = i+1; j <= maxl; ++j) if (a[j] >> i & 1) a[j] ^= t;
a[i] = t;
return;
}
}
}
LL condMax(LL t) {
LL ret = t;
for (int i = maxl; i >= 0; --i) {
if (!(a[i] >> i & 1)) continue;
if (ret >> i & 1) continue;
ret ^= a[i];
}
return ret;
}
};
int main() {
int n, m;
scanf("%d%d", &n, &m);
tot = 0; memset(ne, -1, sizeof ne);
for (int i = 0; i < m; ++i) {
int u, v; LL d;
scanf("%d%d%lld", &u, &v, &d);
add(u, v, d);
}
dfs(1, 0);
LinearBasis lb;
for (int i = 0; i < cnt; ++i) {
if (b[i]) lb.insert(b[i]);
}
printf("%lld\n", lb.condMax(d[n]));
return 0;
}
bzoj 2115 [Wc2011] Xor 路径最大异或和 线性基的更多相关文章
- bzoj 2115 [Wc2011] Xor——路径和环的转化
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 思路很精妙.好像能应用到很多地方. 发现如果路径上有环,可以通过一些走法达到 异或了那 ...
- BZOJ 2115: [Wc2011] Xor
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MB Submit: 2794 Solved: 1184 [Submit][Stat ...
- BZOJ 2115: [Wc2011] Xor DFS + 线性基
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MB Description Input 第一行包含两个整数N和 M, 表示该无向图中 ...
- bzoj 2115: [Wc2011] Xor xor高斯消元
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 797 Solved: 375[Submit][Status] ...
- BZOJ 2115 [Wc2011] Xor ——线性基
[题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有 ...
- BZOJ.2115.[WC2011]Xor(线性基)
题目链接 \(Description\) 给定一张无向带边权图(存在自环和重边).求一条1->n的路径,使得路径经过边的权值的Xor和最大.可重复经过点/边,且边权和计算多次. \(Soluti ...
- BZOJ 2115: [Wc2011] Xor 线性基 dfs
https://www.lydsy.com/JudgeOnline/problem.php?id=2115 每一条从1到n的道路都可以表示为一条从1到n的道路异或若干个环的异或值. 那么把全部的环丢到 ...
- bzoj 2115: [Wc2011] Xor【线性基+dfs】
-老是想到最长路上 其实可以这样:把每个环的xor和都存起来,然后任选一条1到n的路径的xor和ans,答案就是这个ans在环的线性基上跑贪心. 为什么是对的--因为可以重边而且是无相连通的,并且对于 ...
- BZOJ 2115 Wc2011 Xor DFS+高斯消元
标题效果:鉴于无向图.右侧的每个边缘,求一个1至n路径,右上路径值XOR和最大 首先,一个XOR并能为一个路径1至n简单的路径和一些简单的XOR和环 我们开始DFS获得随机的1至n简单的路径和绘图环所 ...
随机推荐
- 一、Shell 教程
Shell 教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了一个 ...
- [转载]Failed to read session data On PHP 7.1
从php5.6升级php7.1,报错 Warning: session_start(): Failed to read session data: user (path: ) Warning: ses ...
- jQuery的select2下拉框的搜索功能(使用select2插件,方便简单)
第一步: 引入我们用使用的插件 jquery: select2: css: js: 第二步: 创建一个html页面,body内容: <div> <select class=" ...
- python2与python3的区别,以及注释、变量、常量与编码发展
python2与python3的区别 宏观上: python2:源码不统一,混乱,重复代码太多. python3:源码统一标准,能去除重复代码. 编码上: python2:默认编码方式为ASCII码. ...
- Python9-From-CSS-day48
1.form表单相关内容前后端有数据交互的时候用form表单form表单提交数据的几个注意事项: 1.所有获取用户输入的标签都必须放在form表单里面 2.action 控制着往哪里提交 3.inpu ...
- Leetcode 872. 叶子相似的树
题目链接 https://leetcode-cn.com/problems/leaf-similar-trees/description/ 题目描述 请考虑一颗二叉树上所有的叶子,这些叶子的值按从左到 ...
- V4L2学习(三)框架分析
整个v4l2的框架分为三层: 在应用层,我们可以在 /dev 目录发现 video0 类似的设备节点,上层的摄像头程序打开设备节点进行数据捕获,显示视频画面.设备节点的名字很统一,video0 vid ...
- PHP 获取客户端用户 IP 地址
一般情况下可以使用以下代码获取到用户 IP 地址 echo 'User IP - '.$_SERVER['REMOTE_ADDR']; // 服务器在局域网的话,那么显示的则是内网IP .// 如果服 ...
- CSU-2031 Barareh on Fire
CSU-2031 Barareh on Fire Description The Barareh village is on fire due to the attack of the virtual ...
- 从输入url开始,完善前端体系架构
原文链接: https://segmentfault.com/a/1190000013662126 从输入URL到页面加载的过程?如何由一道题完善自己的前端知识体系! javascript 前端 23 ...