BZOJ2115 Xor

题目描述:

题目大意:

给定一张 n 个点 m 条边的无向带权连通图,求一条从点 1 到点 n 的路径,使得经过的边权异或和最大。

路径可以经过重复点和重复边,当一条边被重复经过时也会相应地被 xor 多次。

solution

显然(然而我不会严格证明QAQ),答案是由一条 1 到 n 的路径和若干基本环构成的。

先做一个  序,此处定义所有由  中儿子连向父亲的边称为返祖边。

则每一条返祖边会产生一个基本环。

先选择一条1->n的路径,再从所有基本环里选择若干凑出最大异或和即可。

显然可以用线性基维护所有基本环的值。

So easy!

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN=200005;
struct enode{int to; ll c;};
bool vis[MAXN];
int num=0,n,m;
ll s[MAXN],g[MAXN];
vector<enode> e[MAXN];
ll read()
{ll f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+c-'0'; c=getchar(); }return x*f;
}
void dfs(int x,int father)
{//cout<<x<<" "<<s[x]<<endl;vis[x]=1;for (int i=0;i<e[x].size();i++)if (!vis[e[x][i].to]) {s[e[x][i].to]=s[x]^e[x][i].c;dfs(e[x][i].to,x);}else if (e[x][i].to!=father) g[++num]=s[x]^s[e[x][i].to]^e[x][i].c;
}
struct Xor_Basis
{int maxsz;ll basis[65];void init(){ memset(basis,0,sizeof basis); maxsz=63; }bool insert(ll x){for (int i=maxsz;i>=0;i--) if ((x>>i)&1)if (basis[i]) x^=basis[i];else { basis[i]=x; break; }return x; }
} QAQ;
int main()
{QAQ.init();n=read(),m=read();for (int i=1;i<=m;i++){int u=read(),v=read();ll c=read();e[u].push_back((enode){v,c});e[v].push_back((enode){u,c});}dfs(1,0);for (int i=1;i<=num;i++) QAQ.insert(g[i]);ll ans=s[n];for (int i=QAQ.maxsz;i>=0;i--) if (!((ans>>i)&1)) ans^=QAQ.basis[i];printf("%lld\n",ans);return 0;
}

代码较丑,不喜勿喷。

[WC2011][BZOJ2115] Xor相关推荐

  1. P4151 [WC2011]最大XOR和路径(线性基应用)

    P4151 [WC2011]最大XOR和路径 思路 如果单纯的只是树形图,那么答案显然易见只有一种,也就是从头到尾的路径从头到尾的异或值,但是这里不同的就是有可能在道路上有许多的环. 题目有一个重点提 ...

  2. P4151 [WC2011]最大XOR和路径(线性基)

    P4151 [WC2011]最大XOR和路径 对于求解最大异或和路径,首先边可以重复走,最终的结果一定是一条路径和许多环的异或和,因为路径和环之间的边会被走两次,不会被计算,所以我们可以通过dfs树求 ...

  3. 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径

    //bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面 题面描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如 ...

  4. BZOJ2115 XOR(线性基)

    前置知识:线性基 题目描述 有一个边权为非负数的无向连通图,节点编号为 1 1 1到 n n n.求一条从 1 1 1到 n n n的路径,使得路径上经过的边的边权的异或和最大. 路径可以重复经过点和 ...

  5. 【基础操作】线性基详解

    线性基是一个奇妙的集合(我摘的原话) 这里以非 $OI$ 的角度介绍了线性基 基础部分 模板题 给你 $n$ 个数的集合,让你选出任意多个不重复的数,使得它们的异或和最大. 线性基是什么 我们称集合 ...

  6. 线性代数(矩阵、高斯、线性基……)

    矩阵 矩阵加法: 相同位置相加. 矩阵乘法: 满足分配率.结合律,不满足交换律(矩阵与逆矩阵之间除外) . 矩阵转置: 记矩阵为 \(A\) ,则 \(A\) 的转置记为 \(A^T\) . 性质: ...

  7. 高斯消元简单线性代数线性基学习记录

    线性代数,唉 高斯消元 P4035 [JSOI2008]球形空间产生器 题目描述 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标 ...

  8. 解线性方程组——高斯消元の板子

    ATP记得它在很久以前看过一点点高斯消元的东西然后做过一点点题目..但是当时实在是太zz了所以本来就没有很懂这个东西现在更是忘得差不多了.. 所以现在就当重新学一遍了QwQ 一点口胡的解释 高斯消元. ...

  9. 区间子集最大/最小异或和问题(线性基,树上差分)

    闲话 有这样一个问题--一个长度为\(n\)的序列\(a_1-a_n\),\(q\)个询问,每次询问\(l,r\),选出\(\{a_l,a_{l+1}...a_{r}\}\)中一个子集使得子集内元素异 ...

最新文章

  1. 只需三分钟!只需创建一个vuex.js文件,让你马上学会使用Vuex,尽管Vuex是个鸡肋!(扔掉store文件夹和里面的index、getters、actions、mutations等js文件吧!)
  2. 3dcaptcha php,验证simple-php-captcha()输入
  3. 从技术谈到管理,把系统优化的技术用到企业管理
  4. Hybrid Error Correction approach and DeNovo Assembly for MinIon Sequencing Long Reads
  5. ARCSDE的直接连接(SQLSERVER)
  6. 高效程序员的 7 项技能
  7. php后台接受上传图片
  8. CANOpen报文类型
  9. PingInfoView批量PING工具
  10. 网络计算机的分类包括哪些,计算机的分类有哪些
  11. .NET中的设计模式——一步步发现装饰模式
  12. CHR-6dm datasheet 中文翻译
  13. Z-TEKCE COM控制线驱动
  14. org.apache.jasper.JasperException: /app/jsonp.jsp(1,2) Page-encoding specified in jsp-property-grou
  15. python怎么读write_python怎么读
  16. win7桌面我的计算机打不开怎么回事,win7系统双击我的电脑打不开的解决方法
  17. iOS Apple登录一些限制与细节
  18. 计算机组成与结构习题答案,计算机组成与结构习题及答案
  19. 正则表达式——同时验证座机号和手机号
  20. 「文献」杂合基因组的策略思路

热门文章

  1. 不懂这25个名词,好意思说你懂大数据?
  2. 逻辑回归算法背后的数学
  3. c语言中英文的作用,C语言中英文对照.doc
  4. 冒泡排序c java c,冒泡排序,c语言冒泡排序法代码
  5. java基础代码下载_Java基础(一)(示例代码)
  6. python进阶之学习笔记_干货 | Python进阶系列之学习笔记(四)
  7. arm cpu 超频_树莓派 400 超频方法介绍
  8. java压缩成.tar_java压缩tar.gz | 学步园
  9. 单片微型计算机系统应用和开发特点,单片微机原理与应用(第2版)
  10. github可以传java吗_如何在github上传本地项目代码(新手使用)----亲测使用