题目描述

输入

第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目。 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 Di的无向边。 图中可能有重边或自环。

输出

仅包含一个整数,表示最大的XOR和(十进制结果),注意输出后加换行回车。

样例输入

5 7
1 2 2
1 3 2
2 4 1
2 5 1
4 5 3
5 3 4
4 3 2

样例输出

6


题解

DFS树+高斯消元求线性基

首先肯定能够想到,1->n的路径一定是一条链+选择经过某些环。

那么我们只需要处理出链和环的异或和就可以了。

我们使用DFS树预处理,这样每一条返祖边就对应着一个环。

求出所有环以后,要求最大值,我们需要先对环的异或值求一下线性基,然后再贪心处理即可。

#include <cstdio>
#include <algorithm>
#define N 50010
#define M 200010
using namespace std;
typedef long long ll;
int head[N] , to[M] , tag[M] , next[M] , cnt = 1 , vis[N] , deep[N] , num;
ll len[M] , dis[N] , a[M];
void add(int x , int y , ll z)
{
to[++cnt] = y , len[cnt] = z , next[cnt] = head[x] , head[x] = cnt;
}
void dfs(int x)
{
int i;
vis[x] = 1;
for(i = head[x] ; i ; i = next[i])
if(!vis[to[i]])
dis[to[i]] = dis[x] ^ len[i] , deep[to[i]] = deep[x] + 1 , tag[i] = tag[i ^ 1] = 1 , dfs(to[i]);
}
int main()
{
int n , m , i , j , x , y , tot = 0;
ll d , z , ans;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d%lld" , &x , &y , &z) , add(x , y , z) , add(y , x , z);
dfs(1);
for(x = 1 ; x <= n ; x ++ )
for(i = head[x] ; i ; i = next[i])
if(!tag[i] && deep[to[i]] < deep[x])
a[++num] = dis[to[i]] ^ dis[x] ^ len[i];
for(d = 1ll << 62 ; d ; d >>= 1)
{
for(j = ++tot ; j <= num ; j ++ )
{
if(a[j] & d)
{
swap(a[j] , a[tot]);
break;
}
}
if(j > num)
{
tot -- ;
continue;
}
for(j = 1 ; j <= num ; j ++ )
if(j != tot && a[j] & d)
a[j] ^= a[tot];
}
ans = dis[n];
for(i = 1 ; i <= tot ; i ++ )
if((ans ^ a[i]) > ans)
ans ^= a[i];
printf("%lld\n" , ans);
return 0;
}

最新文章

  1. 如何安装appium-linux
  2. 【转】博弈—SG函数
  3. Array.prototype.slice.call(arguments)
  4. win7 64的系统安装。net4.0总是提示安装未成功
  5. [转]Java学习日记之 volatile
  6. BZOJ 2301 【HAOI2011】 Problem b
  7. C/C++ 判断主机字节存储序列
  8. Android PRODUCT_COPY_FILES 自动拷贝文件
  9. SqlServer中的数据类型UniqueIdentifier
  10. [置顶] Guava学习之Multimap
  11. POJ 2411 Mondriaan&#39;s Dream:网格密铺类 状压dp
  12. R实战 第七篇:绘图文本表
  13. js vue 在页面中将摄像头放在一个标签里展示,(模仿手机拍照功能)
  14. C++回顾day01---&lt;命名空间&gt;
  15. C#概念总结(二)
  16. [android] 图片的缩放
  17. 作用域&amp;作用域链和with,catch语句&amp;闭包
  18. MySQL学习(十二)
  19. 机器学习进阶-svm支持向量机
  20. mysql远程访问,修改root密码

热门文章

  1. js创建弹框(提示框,待确认框)
  2. Android(java)学习笔记127:生成 4种不同权限的文件
  3. flash jquery 调用摄像头 vue chrome49浏览器
  4. vue validate多表单验证思考 之前写过一个里外层,现在觉得不合适,应该平行的写,然后都给ret,最后判断ret 再做出反应,这样整体表单的所有验证就都报验证,然后最后提交的时候把组件内的对象合并到总的对象,再提交
  5. C#数组排序方法
  6. 【转】MFC 程序入口和执行流程
  7. c++基本配置属性页
  8. ubuntu安装easygui模块
  9. C语言中sizeof的用法
  10. chrome浏览器跳过(忽略)所有的js断点