博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[WC2011]最大XOR和路径
阅读量:6678 次
发布时间:2019-06-25

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

Description

直接看标题就行

Solution

Xor这种东西,一般就是Trie或者线性基,这个题是线性基。

每个环都可以走到,而且来回的路上不会产生额外的代价,所以为每个环的Xor和建立线性基。算答案的时候随便选一条从1到n的路径就行,因为如果有其他路径,这两条路径一定成环,在线性基里求最值的时候就知道走那个更优了。

Code

#include 
typedef long long LL;const int B = 62;const int N = 50010;const int M = 200010;int hd[N], nxt[M], to[M], cnt, n, m, vis[N];LL w[M], del[N];LL Lb[B];void ins(LL x) { // printf("%I64d\n", x); for (int i = 60; i>=0; --i) { if (!(x>>i) & 1) continue; if (!Lb[i]) { Lb[i] = x; break; } else x ^= Lb[i]; }}LL query(LL x) { for (int i = 60; i >= 0; --i) { if (x < (x^Lb[i])) x ^= Lb[i]; } return x;}void dfs(int x, LL res) { vis[x] = 1; del[x] = res; for (int i = hd[x]; i; i = nxt[i]) if (vis[to[i]]) ins(res^w[i]^del[to[i]]); else dfs(to[i], res^w[i]); }inline void adde(int x, int y, LL z) { to[++cnt] = y; nxt[cnt] = hd[x]; w[cnt] = z; hd[x] = cnt;}int main() { scanf("%d%d", &n, &m); int x, y; LL z; for (int i = 1; i <= m; ++i) { scanf("%d%d%lld", &x, &y, &z); adde(x, y, z); adde(y, x, z); } dfs(1, 0); printf("%lld\n", query(del[n])); return 0;}

转载于:https://www.cnblogs.com/wyxwyx/p/wc2011xor.html

你可能感兴趣的文章
随笔-刚毕业找工作的点滴(程序员)
查看>>
利用poi3.8中SXSSFWorkbook实现大数据量导出excel
查看>>
day34-1 面向对象概述
查看>>
GCD之dispatch queue
查看>>
【Oracle】-初识PL/SQL
查看>>
黄聪:超实用的PHPExcel[导入][导出]实现方法总结
查看>>
模板变量,过滤器和静态文件引入
查看>>
Oracle 中的 Schema
查看>>
Web APi之认证(Authentication)两种实现方式后续【三】(十五)
查看>>
一条语句简单解决“每个Y的最新X”的SQL经典问题
查看>>
(转)链接服务器——获取EXCEL数据
查看>>
《程序员的自我修养-链接、装载和库》
查看>>
Qt 平台中使GUI保持响应流畅
查看>>
Func和Action的用法区别
查看>>
Go数组
查看>>
【原创】oracle提权执行命令工具oracleShell v0.1
查看>>
Mysql 二进制日志
查看>>
《JavaScript面向对象编程指南(第2版)》读书笔记(一)
查看>>
使用Html5+C#+微信 开发移动端游戏详细教程 :(五)游戏图像的加载与操作
查看>>
JAVA入门到精通-第24讲-容器、集合类
查看>>