博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj-2115 Xor
阅读量:6417 次
发布时间:2019-06-23

本文共 1074 字,大约阅读时间需要 3 分钟。

题意:

给出一个有权无向图;

求1到n的路径上的最大异或和。

n<=50000,边权<=10^18。

题解:

因为异或的性质,我们能够知道对于随意一条连通图上的路径的异或和;

都能够由另外一条路径异或若干个环的异或和得来;

由于它们起点和终点都各自是1和n。那么这两个路本身就构成了一个可能经过同样边的环;

而更加显然的是。一个这种非简单环是能够由若干个简单环组成的;

那么异或了这些简单环之后得到了这个非简单环的异或和,再将原来的路径异或上去抵消掉,就是答案了;

所以处理出全部的简单环,和图中随意一条路径的异或和;

然后答案就是任选几个简单环,它们与路径的最大异或和就是答案。

这里用高斯消元来搞就能够了。

时间复杂度 预处理O(n),高斯消元O(60*环的个数);

环不会太多,大概开到了边数就够了;

代码:

#include
#include
#include
#include
#define N 55000#define M 60using namespace std;typedef unsigned long long ll;vector
to[N];vector
val[N];int t[N],tot,n;ll dis[N],a[N<<1],temp;bool vis[N];void dfs(int x,ll len){ vis[x]=1; if(x==n) temp=len; int i,y; for(i=0;i
y) a[++tot]=dis[y]^dis[x]^val[x][i]; } }}int main(){ int m,i,j,k,x,y; ll v,t; scanf("%d%d",&n,&m); for(i=1;i<=m;i++) { scanf("%d%d%llu",&x,&y,&v); to[x].push_back(y),val[x].push_back(v); to[y].push_back(x),val[y].push_back(v); } dfs(1,0); for(i=M,k=0;i>=0;i--) { for(j=k+1,x=0;j<=tot;j++) if((1ll<
temp) temp^=a[i]; printf("%llu",temp); return 0;}

转载地址:http://bcpra.baihongyu.com/

你可能感兴趣的文章
Spring Data JPA Batch Insertion
查看>>
UEditor自动调节宽度
查看>>
JAVA做验证码图片(转自CSDN)
查看>>
Delphi TServerSocket,TClientSocket实现传送文件代码
查看>>
JS无聊之作
查看>>
Mac上搭建ELK
查看>>
443 Chapter7.Planning for High Availability in the Enterprise
查看>>
框架和语言的作用
查看>>
unidac连接ORACLE免装客户端驱动
查看>>
Cygwin + OpenSSH FOR Windows的安装配置
查看>>
咏南中间件支持手机客户端
查看>>
fastscript增加三方控件之二
查看>>
Windows Vista RTM 你准备好了么?
查看>>
Tensorflow Serving 模型部署和服务
查看>>
Java Web开发详解——XML+DTD+XML Schema+XSLT+Servlet 3.0+JSP 2.2深入剖析与实例应用
查看>>
topcoder srm 680 div1 -3
查看>>
具体数学第二版第四章习题(1)
查看>>
高效前端优化工具--Fiddler入门教程
查看>>
【翻译】我钟爱的HTML5和CSS3在线工具
查看>>
Java多线程学习(吐血超详细总结)
查看>>