前置知识:线性基

题目描述

有一个边权为非负数的无向连通图,节点编号为 1 1 1到 n n n。求一条从 1 1 1到 n n n的路径,使得路径上经过的边的边权的异或和最大。

路径可以重复经过点和边,当一条边在路径中出现多次时,其权值在计算异或和时也要被计算相应多的次数。

题解

如果图中没有环,那么 1 1 1到 n n n的无重边的路径显然是最优的。那么如果有环,我们可以先找到一条从 1 1 1到 n n n的路径,算出异或和。然后,用一次dfs求出每个环的异或和。对于一个环,我们可以从 1 1 1到 n n n的路径上任意取一个点,从这个点走到环,绕环一圈后走回这个点。环到点的路径被走过两次,异或两次等于不变,所以就相当于原来 1 1 1到 n n n的路径的异或和再异或上这个环的异或和。

也就是说,我们要选若干个环,使这些环的异或和最大。那么这道题就变成了求若干个数的最大异或和,可以用线性基来解决。不过需要注意的是, 1 1 1到 n n n的路径是必须要选的,不能将这条路径的异或和忽略了。

code

#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,tot,cnt,d[200005],l[200005],r[200005],v[100005];
long long z,ans,w[200005],dis[100005],a[200005],b[105];
void add(int xx,int yy,long long zz){l[++tot]=r[xx];d[tot]=yy;r[xx]=tot;w[tot]=zz;
}
void dfs(int u){v[u]=1;for(int i=r[u];i;i=l[i]){if(v[d[i]]){a[++cnt]=dis[d[i]]^dis[u]^w[i];}else{dis[d[i]]=dis[u]^w[i];dfs(d[i]);}}
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){scanf("%d%d%lld",&x,&y,&z);add(x,y,z);add(y,x,z);}dfs(1);for(int i=1;i<=cnt;i++){for(int j=60;j>=0;j--){if((a[i]>>j)&1){if(b[j]) a[i]^=b[j];else{b[j]=a[i];break;}}}}ans=dis[n];for(int i=60;i>=0;i--){if((ans^b[i])>ans) ans^=b[i];}printf("%lld",ans);return 0;
}

BZOJ2115 XOR(线性基)相关推荐

  1. BZOJ2115:[WC2011] Xor(线性基)

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  2. 2019牛客多校第四场 B xor (线性基求交)

    xor 思路 题目是要求[l,r][l, r][l,r]的所有集合是否都可以得到xxx,那么显然我们可以对这[l,r][l, r][l,r]个线性基求交,然后再特判能否xxx能否插入,如果能插入,显然 ...

  3. HDU 3949 XOR 线性基

    http://acm.hdu.edu.cn/showproblem.php?pid=3949 求异或第k小,结论是第k小就是 k二进制的第i位为1就把i位的线性基异或上去. 但是这道题和上一道线性基不 ...

  4. BZOJ 2115 [Wc2011] Xor ——线性基

    [题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有 ...

  5. 牛客第一场 H XOR —— 线性基

    题目链接:点我啊╭(╯^╰)╮ 题目大意: nnn 个数,求子集内所有数异或为 000 的所有子集大小之和 解题思路: 考虑每个值对答案的贡献     首先对 nnn 个数消一次元,得到 rrr 个基 ...

  6. 【HDU 3949】 XOR|线性基

    忘记把调试信息去掉 不是第一次犯这种情况啦.... #include <cstdio> #include <cstring> #include <iostream> ...

  7. 【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS

    [BZOJ2115][Wc2011] Xor Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ...

  8. 【BZOJ2115】Xor,第一次的线性基

    Time:2016.08.26 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 权值就是一条单路径(1->n)+所有环 dfs把它们求出来就可以了 复杂度O(n+m)O(n+m ...

  9. HDU3949 XOR (线性基、查找第k小值)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 我们用高斯消元求出的a1,a2,-,ana_1,a_2, \dots,a_na1​,a2​,-,an​ ...

最新文章

  1. 部署tomcat环境
  2. 机器学习基本概念-阿里云大学
  3. c语言定义数组变量初始化为0,c语言数组初始化——int a[N] = {0};
  4. ASP.NET MVC+LINQ开发一个图书销售站点(9):编辑目录
  5. Chrome谷歌浏览器私密浏览自动开启功能获批专利
  6. 能看懂vue源码什么水平_送你 Vue 学习路线的最佳实践
  7. 云计算学习笔记---异常处理---hadoop问题处理ERROR org.apache.hadoop.hdfs.server.datanode.DataNode: java.lang.NullPoin
  8. synchronized基础
  9. 系统学习机器学习之SVM(一)
  10. 普元eos根据查询条件导出excel表格
  11. 发出商品杀手锏之SAP在途库存解决方案
  12. .ppt和.pptx有什么区别
  13. android添加nfc门禁卡,IOS14nfc怎么添加门禁卡?NFC门禁卡教程[多图]
  14. 关于tensor的shape理解
  15. 如何通过手机设置苹果账户的双重认证
  16. 9.8 按钮button
  17. Ps如何使用透视裁剪工具
  18. 【吴恩达机器学习】第五周课程精简笔记——代价函数和反向传播
  19. SqlHelper的使用
  20. MATLAB中代尔塔的符号,这个符号代表什么意思?还有怎么打?~

热门文章

  1. 不混淆 android jni,安卓开发,打包时是不是不能加混淆?
  2. 青云学院—一家培训UI的学校
  3. Python数组基本操作
  4. IntelliJ IDEA Spring Boot(5) 集成Hibernate
  5. 新手如何学习Java三大框架?
  6. IMPDP/EXPDP + network_link的使用
  7. 2020 年新基建七大领域 数据“新基建”
  8. 计算机专业二本分数线大概是,我高考大概只能考400分了,想学计算机,你们说能到什么学校...
  9. 硬盘分区并且重新格式化之后的数据恢复
  10. Linux MySQL 查看版本号