题目大意:

给你一张n个点,m条边的无向图,每条边都有一个权值,求:1到n的路径权值和的最大值。

题解:

任意一条路径都能够由一条简单路径(任意一条),在接上若干个环构成(如果不与这条简单路径相连就走过去再走回来)。

那么在对这些环进行分类:

1、直接与简单路径相连

相交的重复部分不算就可以了。

2、不与简单路径相连

我们需要跑过去,再跑回来对吧,这样的话,不管我们是怎么跑的,非环的路径对答案的贡献始终为0,(抵消了嘛)。

这样的话,我们只需要用这几个环来构造线性基即可,最后再找个最大值就行啦!

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=50005,M=200005;
ll b[65],dist[M],d[N],z,ans;
int head[N],vet[M],nxt[M],n,m,x,y,tot;
bool vis[N],used[M];
void add(int x,int y,ll z){
nxt[++tot]=head[x];
vet[tot]=y;
head[x]=tot;
dist[tot]=z;
}
void insert(ll x){
for (int i=63;i>=0;i--)
if (x>>i)
if (b[i]) x^=b[i];
else {b[i]=x; break;}
}
void dfs(int u){ //找环
vis[u]=true;
for (int i=head[u];i;i=nxt[i]){
int v=vet[i];
if (!vis[v]){
d[v]=d[u]^dist[i];
dfs(v);
} else
if (!used[i^1]){
used[i^1]=true;
insert(d[u]^d[v]^dist[i]);
}
}
}
int main(){
scanf("%d %d",&n,&m); tot=1;
for (int i=1;i<=m;i++){
scanf("%d %d %lld",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
dfs(1);
ans=d[n];
for (int i=63;i>=0;i--)
if ((ans^b[i])>ans) ans=ans^b[i];
printf("%lld\n",ans);
return 0;
}

最新文章

  1. html5+jqueryMobile编写App推广注册页
  2. java如何跳出多重嵌套循环
  3. Web 前沿——HTML5 Form Data 对象的使用
  4. php中防盗链使用.htaccess
  5. 彻底删除mysql服务
  6. Android 线程与消息 机制 15问15答
  7. shell重定向调试信息
  8. 【poj解题】3663
  9. (转)Unity3D中移动物体位置的几种方法
  10. spring Boot+spring Cloud实现微服务详细教程第一篇
  11. [Reinforcement Learning] Value Function Approximation
  12. CentOS7 nexus 3 搭建maven或gradle 私有代理服务器
  13. C++ allocator
  14. c++ 面试题(网络类)
  15. [20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED2.txt
  16. 我的G++编译选项
  17. [转载]DLL命名规则
  18. C/C++中near和far的区别
  19. C# winform 编程 向ACCESS数据库导入EXCEL表使用心得
  20. [转]How to log queries using Entity Framework 7?

热门文章

  1. 常用mac命令
  2. 深入了解Netty【一】BIO、NIO、AIO简单介绍
  3. YoloV4当中的Mosaic数据增强方法(附代码详细讲解)码农的后花园
  4. 20190923-01Linux帮助命令 000 009
  5. latex 封面
  6. jmeter远程调用
  7. (超详细)动手编写 — 栈、队列 ( Java实现 )
  8. SpringMVC-09-Ajax技术
  9. js中小球碰壁反弹
  10. 218。重复元素II(重复元素的下标差值&lt;=K)(哈希)