P4151 [WC2011]最大XOR和路径

题目描述

XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假。 XOR 运算的真值表如下( 1 表示真, 0 表示假):

而两个非负整数的 XOR 是指将它们表示成二进制数,再在对应的二进制位进行 XOR 运算。

譬如 12 XOR 9 的计算过程如下:

故 12 XOR 9 = 5 。

容易验证, XOR 运算满足交换律与结合律,故计算若干个数的 XOR 时,不同的计算顺序不会对运算结果造成影响。从而,可以定义 KK 个非负整数 \(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}\) 。


题解

怎么说呢。有这样一条定理

(不知道这个之前的我根本不会做这道题)

  • 任意一条 \(1\) 到 \(n\) 的路径的异或和,都可以由任意一条 \(1\) 到 \(n\) 路径的异或和与图中的一些环的异或和来组合得到。

为什么?

如果我们走一条路径的话,如果路径上存在一个环,那么这个环的总异或值就可以下放到线性基。因为把这个环走两遍就等于没走这个环,同样我如果是由一条路径到的这个环,沿原路返回,那等于那条路径没走,只走了环。

在这种条件下,我们可以考虑把环储存为一个线性基的元素。因为这个元素是可选和可不选的。

那么为什么是任意的简单路径呢?

因为 \(1\) 到 \(N\) 的简单路径是必须要走的。这显然。

然后如果有多条 \(1\) 到 \(N\) 的路径,那么这显然也构成一个环,也是可以抵消异或的任意一条其他的路径的是吧。

然后这个题目就好做了咕咕咕。


代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#define ll long long
using namespace std;
ll dis[50001],sum[101],b[101];
ll n,m,vis[50001];
int head[100001],num;
struct node{
int next,to;
ll v;
}e[100001<<1]; ll read()
{
ll x=0,w=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
} void add(int from,int to,ll v){
num++;
e[num].to=to;
e[num].v=v;
e[num].next=head[from];
head[from]=num;
} void update(ll x){
for(int i=60;i>=0;i--){
if(sum[i]&x){
if(b[i])x^=b[i];
else {
b[i]=x;
break;
}
}
}
} void dfs(int x){
vis[x]=1;
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if(vis[v])update(dis[v]^e[i].v^dis[x]);
else dis[v]=dis[x]^e[i].v,dfs(v);
}
} ll query(ll x){
ll ans=x;
for(int i=60;i>=0;i--){
if((ans^b[i])>ans)ans^=b[i];
}
return ans;
} int main()
{
n=read();m=read();
sum[0]=1;for(int i=1;i<=60;i++)sum[i]=sum[i-1]*2;
for(int i=1;i<=m;i++){
ll x=read(),y=read(),z=read();
add(x,y,z);add(y,x,z);
}
dfs(1);
printf("%lld",query(dis[n]));
return 0;
}

[WC2011]最大XOR和路径(线性基)的更多相关文章

  1. [WC2011]最大XOR和路径 线性基

    [WC2011]最大XOR和路径 LG传送门 需要充分发掘经过路径的性质:首先注意不一定是简单路径,但由于统计的是异或值,重复走是不会被统计到的,考虑对于任意一条从\(1\)到\(n\)的路径的有效部 ...

  2. 洛谷P4151 [WC2011] 最大XOR和路径 [线性基,DFS]

    题目传送门 最大XOR和路径 格式难调,题面就不放了. 分析: 一道需要深刻理解线性基的题目. 好久没打过线性基的题了,一开始看到这题还是有点蒙逼的,想了几种方法全被否定了.还是看了大佬的题解才会做的 ...

  3. [luogu4151 WC2011] 最大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 说明 [样例说明] 根据异或的性质,将一个数异或两 ...

  4. P4151 [WC2011]最大XOR和路径 线性基

    题目传送门 题意:给出一幅无向图,求1到n的所有路径中最大异或和,一条边可以被重复经过. 思路: 参考了大佬的博客 #pragma GCC optimize (2) #pragma G++ optim ...

  5. P4151 最大XOR和路径 线性基

    题解见:https://www.luogu.org/problemnew/solution/P4151 其实就是找出所有环 把环上所有边异或起来得到的值扔到线性基里面 然后随便走一条从1~n的链 最后 ...

  6. 洛谷 P4151 [WC2011]最大XOR和路径 解题报告

    P4151 [WC2011]最大XOR和路径 题意 求无向带权图的最大异或路径 范围 思路还是很厉害的,上午想了好一会儿都不知道怎么做 先随便求出一颗生成树,然后每条返祖边都可以出现一个环,从的路径上 ...

  7. 题解-[WC2011]最大XOR和路径

    [WC2011]最大XOR和路径 给一个 \(n\) 个点 \(m\) 条边(权值为 \(d_i\))的无向有权图,可能有重边和子环.可以多次经过一条边,求 \(1\to n\) 的路径的最大边权异或 ...

  8. P4151 [WC2011]最大XOR和路径

    P4151 [WC2011]最大XOR和路径 一道妙极了的题. 首先直接从1走到n 然后现在图上有很多环 所以可以在走到n之后走到环上一个点,再走一遍环,再原路返回.这样就会xor上环的权值. 然后只 ...

  9. [WC2011]最大XOR和路径(贪心+线性基)

    题目大意:给一张无向图,求一条1-n的路径,是路径边权的异或和最小. 题解 这道题的思路很妙,首先我们可以随便找出一条从1到n的路径来,然后我们可以选一些环. 其实不管这个环和这条路径有怎样的关系,我 ...

随机推荐

  1. Django(1.7 part1)

    django安装: django解压后目录下有一个setup.py文件,在命令行运行python setup.py install,当前前提是已经安装了python才能执行命令,然后用下面命令检查dj ...

  2. C# Lambda && Linq

    Lambda表达式在C#3.0加入,它是一个匿名函数,可用于创建委托或者表达式树类型,运算符为=>,读作"goes to",=>左侧是变量,右侧是表达式,变量类型可以自 ...

  3. HTML基础——网站图片显示页面

    1.图片标签 <img /> 属性: src:指的是图片显示的路径(位置) 绝对路径:D:\Pictures\Saved Pictures 相对路径: ①同一级:直接写文件名称或者./文件 ...

  4. SQLServer 错误: 15404,维护计划无法执行

    错误症状: D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG下面的ERROELOG,用文本打,查看运行维维计划不成功是生成的错误日志详细信 ...

  5. 【原创】TimeSten安装与配置

    1.安装TimeSten 2.安装时要指定TNS_ADMIN_LOCATION,即tnsnames.ora的路径,因为tt会根据这个连接Oracle.C:\TimesTen\tt1122_32\net ...

  6. ActiveMQ学习笔记(4)----JMS的API结构和开发步骤

    1. JMS的API结构 其实上图中的五个API在第一节中我们都已经使用到了.本节将会讲非持久化和持久化topic的使用. 2. JMS的基本开发步骤 1. 创建一个JMS工厂,  Connectio ...

  7. 实验二实验结论&实验总结与体会

    Part1:格式化输出函数printf()和格式化输入函数scanf() ① /* <C语言程序设计教程学习指导>p118 实验内容(1) 这是一个常用格式控制符使用示例 运行程序,结合运 ...

  8. 洛谷 P3924 康娜的线段树

    P3924 康娜的线段树 题目描述 小林是个程序媛,不可避免地康娜对这种人类的“魔法”产生了浓厚的兴趣,于是小林开始教她OI. 今天康娜学习了一种叫做线段树的神奇魔法,这种魔法可以维护一段区间的信息, ...

  9. Python库之pyudev (一)

    库pyudev是libudev的python封装,libudev提拱了对本地设备的列举与查询API. 1.安装 pip install pyudev 2. 使用 2.1 开始 导入pyudev,验证库 ...

  10. 【Unity】近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享。

    近期整理Unity4.x 项目升级Unity5.0 过程中出现的各种常见问题,与大家共享. 1:Unity4.x 项目中3D模型其材质丢失,成为"白模"?       解决方式:手 ...