[WC2011]最大XOR和路径(线性基)
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和路径(线性基)的更多相关文章
- [WC2011]最大XOR和路径 线性基
[WC2011]最大XOR和路径 LG传送门 需要充分发掘经过路径的性质:首先注意不一定是简单路径,但由于统计的是异或值,重复走是不会被统计到的,考虑对于任意一条从\(1\)到\(n\)的路径的有效部 ...
- 洛谷P4151 [WC2011] 最大XOR和路径 [线性基,DFS]
题目传送门 最大XOR和路径 格式难调,题面就不放了. 分析: 一道需要深刻理解线性基的题目. 好久没打过线性基的题了,一开始看到这题还是有点蒙逼的,想了几种方法全被否定了.还是看了大佬的题解才会做的 ...
- [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 说明 [样例说明] 根据异或的性质,将一个数异或两 ...
- P4151 [WC2011]最大XOR和路径 线性基
题目传送门 题意:给出一幅无向图,求1到n的所有路径中最大异或和,一条边可以被重复经过. 思路: 参考了大佬的博客 #pragma GCC optimize (2) #pragma G++ optim ...
- P4151 最大XOR和路径 线性基
题解见:https://www.luogu.org/problemnew/solution/P4151 其实就是找出所有环 把环上所有边异或起来得到的值扔到线性基里面 然后随便走一条从1~n的链 最后 ...
- 洛谷 P4151 [WC2011]最大XOR和路径 解题报告
P4151 [WC2011]最大XOR和路径 题意 求无向带权图的最大异或路径 范围 思路还是很厉害的,上午想了好一会儿都不知道怎么做 先随便求出一颗生成树,然后每条返祖边都可以出现一个环,从的路径上 ...
- 题解-[WC2011]最大XOR和路径
[WC2011]最大XOR和路径 给一个 \(n\) 个点 \(m\) 条边(权值为 \(d_i\))的无向有权图,可能有重边和子环.可以多次经过一条边,求 \(1\to n\) 的路径的最大边权异或 ...
- P4151 [WC2011]最大XOR和路径
P4151 [WC2011]最大XOR和路径 一道妙极了的题. 首先直接从1走到n 然后现在图上有很多环 所以可以在走到n之后走到环上一个点,再走一遍环,再原路返回.这样就会xor上环的权值. 然后只 ...
- [WC2011]最大XOR和路径(贪心+线性基)
题目大意:给一张无向图,求一条1-n的路径,是路径边权的异或和最小. 题解 这道题的思路很妙,首先我们可以随便找出一条从1到n的路径来,然后我们可以选一些环. 其实不管这个环和这条路径有怎样的关系,我 ...
随机推荐
- Ajax :六个全局事件
加载请求: .ajaxStart() 和 .ajaxstop() $(document).ajaxStart(function(){ $('.loading').show(); }).ajaxStop ...
- 【算法】Kruskal算法(解决最小生成树问题) 含代码实现
Kruskal算法和Prim算法一样,都是求最小生成树问题的流行算法. 算法思想: Kruskal算法按照边的权值的顺序从小到大查看一遍,如果不产生圈或者重边,就把当前这条边加入到生成树中. 算法的正 ...
- Golang环境配置Centos
1.下载go程序包( go1.7rc1.linux-amd64.tar.gz)(http://www.golangtc.com/static/go/1.7rc1/go1.7rc1.linux-am ...
- 找出在使用临时表空间的SQL
SELECT a.username, a.sid, a.serial#, a.osuser, b.tablespace, b.blocks, c.sql_text FROM v$session a, ...
- ActiveMQ学习笔记(21)----ActiveMQ集成Tomcat
1. 监控和管理Broker Web Console 方式:直接访问ActiveMQ的管理页面:http://localhost:8161/admin,默认的用户名和密码是admin/admin.具体 ...
- asp.net core 与EFcore 入门
什么是EFcore? Entity Framework (EF) Core 是轻量化.可扩展和跨平台版的常用 Entity Framework 数据访问技术,EF Core 可用作对象关系映射程序 ( ...
- NOIp2018模拟赛四十四
加量不加价?! 昨晚看时间变成了3.5h以为终于变成了正常难度,结果还是国家集训队作业... A题看起来很神仙,B题看上去很神仙,C题一看就知道很神仙: 结果发现B是假题,放榜后发现A也是假题,C是Y ...
- POJ 3134 Power Calculus (迭代剪枝搜索)
题目大意:略 题目里所有的运算都是幂运算,所以转化成指数的加减 由于搜索层数不会超过$2*log$层,所以用一个栈存储哪些数已经被组合出来了,不必暴力枚举哪些数已经被搜出来了 然后跑$iddfs$就行 ...
- sqlmap 实战漏洞平台dvwa进行密码破解
2016-05-24 (1)实验的具体的环境极其思路 首先我们要检测我们的漏洞平台是否有sql注入 ,进行简单的测试发现在用户userid 上存在注入的漏洞 使用抓包工具对其cookie 进行获取如下 ...
- 紫书 习题 8-16 UVa 1618 (中途相遇法)
暴力n的四次方, 然而可以用中途相遇法的思想, 分左边两个数和右边两个数来判断, 最后合起来判断. 一边是n平方logn, 合起来是n平方logn(枚举n平方, 二分logn) (1)两种比较方式是相 ...