洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径
//bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面
题面描述
XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假。 XOR 运算的真值表如下(\(1\) 表示真, \(0\) 表示假):

而两个非负整数的 XOR 是指将它们表示成二进制数,再在对应的二进制位进行 XOR 运算。
譬如 \(12\) XOR \(9\) 的计算过程如下:

故 \(12\) XOR \(9\) = 5$。
容易验证, XOR 运算满足交换律与结合律,故计算若干个数的 XOR 时,不同的计算顺序不会对运算结果造成影响。从而,可以定义 \(K\) 个非负整数 \(A_1,A_2,……,A_{K-1},A_K\)的 XOR 和为
\(A_1\) XOR \(A_2\) XOR …… XOR \(A_{K-1}\) XOR \(A_K\)
考虑一个边权为非负整数的无向连通图,节点编号为 \(1\) 到 \(N\),试求出一条从 \(1\) 号节点到 \(N\) 号节点的路径,使得路径上经过的边的权值的 XOR 和最大。
路径可以重复经过某些点或边,当一条边在路径中出现了多次时,其权值在计算 XOR 和时也要被计算相应多的次数,具体见样例。
输入格式
输入文件 xor.in 的第一行包含两个整数 \(N\) 和 \(M\), 表示该无向图中点的数目与边的数目。
接下来 \(M\) 行描述 \(M\) 条边,每行三个整数 \(S_i\), \(T_i\) , \(D_i\), 表示 \(S_i\) 与 \(T_i\) 之间存在一条权值为 \(D_i\) 的无向边。
图中可能有重边或自环。
输出格式
输出文件 xor.out 仅包含一个整数,表示最大的 XOR 和(十进制结果)。
输入输出样例
输入 #1
5 7
1 2 2
1 3 2
2 4 1
2 5 1
4 5 3
5 3 4
4 3 2
输出 #1
6
说明/提示
【样例说明】

如图,路径\(1 \rightarrow 2 \rightarrow 4 \rightarrow 3 \rightarrow 5 \rightarrow 2 \rightarrow 4 \rightarrow 5\)对应的XOR和为
\(2\) XOR \(1\) XOR \(2\) XOR \(4\) XOR \(1\) XOR \(1\) XOR \(3 = 6\)
当然,一条边数更少的路径\(1 \rightarrow 3 \rightarrow 5\)对应的XOR和也是\(2\) XOR \(4 = 6\)。
【数据规模】
对于 \(20 \%\) 的数据,\(N \leq 100,M \leq 1000,D_i \leq 10^{4}\);
对于 \(50 \%\) 的数据,\(N \leq 1000,M \leq 10000,D_i \leq 10^{18}\);
对于 \(70 \%\) 的数据,\(N \leq 5000,M \leq 50000,D_i \leq 10^{18}\);
对于 \(100 \%\) 的数据,\(N \leq 50000\), \(M \leq 100000\),\(D_i \leq 10^{18}\)。
解题思路
看了题解可知,这题先dfs一遍图,随便找一条从起点到终点的路,求出路上的异或值,同时把所有搜索到的环的异或值全部加入线性基,然后把那条路上的异或值放到线性基里,找能够异或到的最大值,然后就是答案。敷衍
这题的思想有点像我这学期高数刚学的格林公式,不知道的就别管这个词了。我们从那条路起点\(1\)出发,到达路中间的一个点\(x\),然后离开这条路,通过某一段 \(x \rightarrow y\) 走到某个环上的一个点\(y\),然后从点\(y\)开始绕环一周,回到点\(y\),再从点\(y\)通过刚才那段\(y \rightarrow x\) 回到点\(x\),再接着走完那条路剩下的部分\(x\rightarrow n\)。由“异或两次同一个数相当于没有异或”的性质可以知道,\(x\rightarrow y\)和\(y\rightarrow x\)就互相抵消了,于是答案就是\(1\rightarrow n\)的异或值再异或上那个环的异或值。再多走几个环,就再多异或几个环就好。
那么为什么最开始随便选一条路就好呢?是这样:假设存在两条路可以从\(1\)到\(n\),那么因为是无向图,这两条路就成了一个环,我们dfs过程中就会把这个环加入线性基。走了其中一条路,再走这个环,就相当于走了另一条路。
源代码
#include<stdio.h>
const int MAXN=5e5+5,MAXM=4e5+5;
typedef long long ull;
int n,m;
struct Edge{
int nxt,to;
ull w;
}e[MAXM<<1];
int cnt=1,head[MAXN];
inline void add(int u,int v,ull w)
{
e[cnt]={head[u],v,w};
head[u]=cnt++;
e[cnt]={head[v],u,w};
head[v]=cnt++;
}
ull b[64]={0};//线性基
inline void addb(ull a)
{
for(int i=62;~i;i--)
{
if(a>>i)
{
if(b[i]) a^=b[i];
else
{
b[i]=a;
return;
}
}
}
}
inline ull mx(ull ans)
{
for(int i=62;~i;i--)
if((ans^b[i])>ans) ans^=b[i];
return ans;
}
bool vis[MAXN];
ull dis[MAXN];//从1搜过来的值
void dfs(int u)
{
vis[u]=1;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(vis[v])
addb(dis[v]^dis[u]^e[i].w);
else
{
dis[v]=dis[u]^e[i].w;
dfs(v);
}
}
}
int main()
{
//freopen("test.in","r",stdin);
scanf("%d%d",&n,&m);
while(m--)
{
int u,v;
ull w;
scanf("%d%d%lld",&u,&v,&w);
add(u,v,w);
}
dfs(1);
printf("%lld\n",mx(dis[n]));
return 0;
}
洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径的更多相关文章
- 洛谷 P4151 [WC2011]最大XOR和路径 解题报告
P4151 [WC2011]最大XOR和路径 题意 求无向带权图的最大异或路径 范围 思路还是很厉害的,上午想了好一会儿都不知道怎么做 先随便求出一颗生成树,然后每条返祖边都可以出现一个环,从的路径上 ...
- P4151 [WC2011]最大XOR和路径
P4151 [WC2011]最大XOR和路径 一道妙极了的题. 首先直接从1走到n 然后现在图上有很多环 所以可以在走到n之后走到环上一个点,再走一遍环,再原路返回.这样就会xor上环的权值. 然后只 ...
- [WC2011]最大XOR和路径(线性基)
P4151 [WC2011]最大XOR和路径 题目描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如下( 1 表示真, 0 表 ...
- [WC2011]最大XOR和路径 线性基
[WC2011]最大XOR和路径 LG传送门 需要充分发掘经过路径的性质:首先注意不一定是简单路径,但由于统计的是异或值,重复走是不会被统计到的,考虑对于任意一条从\(1\)到\(n\)的路径的有效部 ...
- 题解-[WC2011]最大XOR和路径
[WC2011]最大XOR和路径 给一个 \(n\) 个点 \(m\) 条边(权值为 \(d_i\))的无向有权图,可能有重边和子环.可以多次经过一条边,求 \(1\to n\) 的路径的最大边权异或 ...
- 洛谷P4151 [WC2011] 最大XOR和路径 [线性基,DFS]
题目传送门 最大XOR和路径 格式难调,题面就不放了. 分析: 一道需要深刻理解线性基的题目. 好久没打过线性基的题了,一开始看到这题还是有点蒙逼的,想了几种方法全被否定了.还是看了大佬的题解才会做的 ...
- 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
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, 表示该无向图中 ...
随机推荐
- python 压缩文件(解决压缩路径问题)
#压缩文件 def Zip_files(): datapath = filepath # 证据路径 file_newname = datapath + '.zip' # 压缩文件的名字 log.deb ...
- 自己动手实现一个html2canvas
前言 昨天写了新手引导动画的4种实现方式,里面用到了 html2canvas 于是就顺便了解了一下实现思路. 大概就是 利用 svg 的 foreignObject 标签, 嵌入 dom, 最后再利用 ...
- Linux 问题集
解决E: Encountered a section with no Package: header错误 我的ubuntu机器上出现下面这个错误. Reading package lists... E ...
- mysql小数和类型转换函数
保留两位小数 SELECT ROUND( 123456789.3563898,2),TRUNCATE(123456789.3563898,2),FORMAT(123456789.3563898,2); ...
- centos安装mysql以及授权登录用户
CentOS第一次安装MySQL的完整步骤 目录 1.官方安装文档 2.下载 Mysql yum包 3.安转软件源 4.安装mysql服务端 5.首先启动mysql ...
- 定义一个Book类,有书名,价格,作者等信息。定义相应的方法来改变这些属性的值。定义一个方法来显示Book的所有信息。
package com.fs.test; public class Test { public static void main(String[] args) { // 先声明后赋值 book b;/ ...
- java复习(3)继承
一.继承为题的提出 ---------------------------------------------------- 我们知道面向对象的三大特性是:封装.继承和多态,可以知道继承在java应用 ...
- 苹果浏览器和ios中,时间字符串转换问题
背景:在开发PC端项目和小程序时,遇到过一个时间字符串转化问题,在苹果浏览器和ios微信客户端里,"2018-10-15 18:20" 以 字符"-"拼接的时间 ...
- Java动态加载类
详见:https://blog.csdn.net/zai_xia/article/details/80026325 扩展:java反射机制与动态加载类 https://www.cnblogs.com/ ...
- Java并发(基础知识)—— 创建、运行以及停止一个线程
在计算机世界,当人们谈到并发时,它的意思是一系列的任务在计算机中同时执行.如果计算机有多个处理器或者多核处理器,那么这个同时性是真实发生的:如果计算机只有一个核心处理器那么就只是表面现象. 现代所有的 ...