【bzoj2115】[Wc2011] Xor DFS树+高斯消元求线性基
2024-10-20 11:53:25
题目描述
输入
第一行包含两个整数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;
}
最新文章
- 如何安装appium-linux
- 【转】博弈—SG函数
- Array.prototype.slice.call(arguments)
- win7 64的系统安装。net4.0总是提示安装未成功
- [转]Java学习日记之 volatile
- BZOJ 2301 【HAOI2011】 Problem b
- C/C++ 判断主机字节存储序列
- Android PRODUCT_COPY_FILES 自动拷贝文件
- SqlServer中的数据类型UniqueIdentifier
- [置顶] Guava学习之Multimap
- POJ 2411 Mondriaan&#39;s Dream:网格密铺类 状压dp
- R实战 第七篇:绘图文本表
- js vue 在页面中将摄像头放在一个标签里展示,(模仿手机拍照功能)
- C++回顾day01---<;命名空间>;
- C#概念总结(二)
- [android] 图片的缩放
- 作用域&;作用域链和with,catch语句&;闭包
- MySQL学习(十二)
- 机器学习进阶-svm支持向量机
- mysql远程访问,修改root密码
热门文章
- js创建弹框(提示框,待确认框)
- Android(java)学习笔记127:生成 4种不同权限的文件
- flash jquery 调用摄像头 vue chrome49浏览器
- vue validate多表单验证思考 之前写过一个里外层,现在觉得不合适,应该平行的写,然后都给ret,最后判断ret 再做出反应,这样整体表单的所有验证就都报验证,然后最后提交的时候把组件内的对象合并到总的对象,再提交
- C#数组排序方法
- 【转】MFC 程序入口和执行流程
- c++基本配置属性页
- ubuntu安装easygui模块
- C语言中sizeof的用法
- chrome浏览器跳过(忽略)所有的js断点