题目传送门

最大XOR和路径

格式难调,题面就不放了。


  分析:

  一道需要深刻理解线性基的题目。

  好久没打过线性基的题了,一开始看到这题还是有点蒙逼的,想了几种方法全被否定了。还是看了大佬的题解才会做的。

  首先我们能想到,在图中从$1$走到$n$有这么两种情况,一种是一条链直接走到$n$,另一种是先走链然后绕若干个环然后回到链上走到$n$。对于这道题显然我们是要考虑所有的环的(由异或的性质可知)。

  然后我们又可以发现,如果一条链和一个环中间有一条路径相连,那么我们从链上走到环上时会经过这条路径一次,从环上回到链上时又会走这条路径一次,那么两次走过的路径异或和就是$0$!

  再看,如果从$1$走到$n$有若干条链,那么这些链会相互构成若干个环,如果我们走了一条链,然后让这条链异或这些环,就可以得到对应的另一条链!(可以自己画图分析一下,博主太懒不想画图_(:з」∠)_)

  综合一下上面的性质,我们就能得到一种算法:进行一遍$DFS$,把所有的环构造成线性基,然后把任意一条从$1$到$n$的链放入线性基中求最大异或和。

  $SO$,这道黑题就这么过了。

  博主手残写了个$namespace$,不过好像跑得还挺快。

  Code:

//It is made by HolseLee on 3rd Sep 2018
//Luogu.org P4151
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std; typedef long long ll;
const int N=5e4+,M=2e5+;;
int n,m,head[N],cnte;
ll dis[N],b[];
bool vis[N];
struct Node {
int to,nxt; ll val; Node() {}
Node(int _to,ll _val,int _nxt): to(_to),val(_val),nxt(_nxt) {}
}e[M]; namespace LinerBase {
void insert(ll x)
{
for(int i=; i>=; --i) {
if( !(x>>i) ) continue;
if( !b[i] ) {
b[i]=x; break;
} else {
x^=b[i];
}
}
} ll quary(ll x)
{
ll ret=x;
for(int i=; i>=; --i) {
if( (ret^b[i])>ret ) ret^=b[i];
}
return ret;
}
} inline ll read()
{
char ch=getchar(); ll num=; bool flag=false;
while( ch<'' || ch>'' ) {
if( ch=='-' ) flag=true;
ch=getchar();
}
while( ch>='' && ch<='' ) {
num=num*+ch-'';
ch=getchar();
}
return flag ? -num : num;
} inline void add(int x,int y,ll z)
{
e[++cnte]=Node(y,z,head[x]);
head[x]=cnte;
} void dfs(int x,ll now)
{
dis[x]=now, vis[x]=true;
for(int i=head[x]; i; i=e[i].nxt) {
if(!vis[e[i].to]) dfs(e[i].to,now^e[i].val);
else LinerBase::insert(now^e[i].val^dis[e[i].to]);
}
} int main()
{
n=read(); m=read();
int x,y;ll z;
for(int i=; i<=m; ++i) {
x=read(), y=read(), z=read();
add(x,y,z); add(y,x,z);
}
dfs(,);
printf("%lld\n",LinerBase::quary(dis[n]));
return ;
}

洛谷P4151 [WC2011] 最大XOR和路径 [线性基,DFS]的更多相关文章

  1. 洛谷 P4151 [WC2011]最大XOR和路径 解题报告

    P4151 [WC2011]最大XOR和路径 题意 求无向带权图的最大异或路径 范围 思路还是很厉害的,上午想了好一会儿都不知道怎么做 先随便求出一颗生成树,然后每条返祖边都可以出现一个环,从的路径上 ...

  2. [洛谷P4151][WC2011]最大XOR和路径

    题目大意:给你一张$n$个点$m$条边的无向图,求一条$1->n$的路径,使得经过路径值的异或值最大(重复经过重复计算) 题解:某条路$k$被重复走了两次,那么它的权值对答案的贡献就是$0$,但 ...

  3. 洛谷P4151 [WC2011]最大XOR和路径(线性基)

    传送门 不知道线性基是什么东西的可以看看蒟蒻的总结 首先看到异或就想到线性基 我们考虑有一条路径,那么从这条路径走到图中的任意一个环再走回这条路径上,对答案的贡献是这个环的异或和,走到这个环上的路径对 ...

  4. P4151 [WC2011]最大XOR和路径 线性基

    题目传送门 题意:给出一幅无向图,求1到n的所有路径中最大异或和,一条边可以被重复经过. 思路: 参考了大佬的博客 #pragma GCC optimize (2) #pragma G++ optim ...

  5. [WC2011]最大XOR和路径 线性基

    [WC2011]最大XOR和路径 LG传送门 需要充分发掘经过路径的性质:首先注意不一定是简单路径,但由于统计的是异或值,重复走是不会被统计到的,考虑对于任意一条从\(1\)到\(n\)的路径的有效部 ...

  6. [luogu4151 WC2011] 最大XOR和路径 (线性基)

    传送门 输入输出样例 输入样例#1: 5 7 1 2 2 1 3 2 2 4 1 2 5 1 4 5 3 5 3 4 4 3 2 输出样例#1: 6 说明 [样例说明] 根据异或的性质,将一个数异或两 ...

  7. P4151 [WC2011]最大XOR和路径

    P4151 [WC2011]最大XOR和路径 一道妙极了的题. 首先直接从1走到n 然后现在图上有很多环 所以可以在走到n之后走到环上一个点,再走一遍环,再原路返回.这样就会xor上环的权值. 然后只 ...

  8. [bzoj2115] [洛谷P4151] [Wc2011] Xor

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

  9. 【线性基/神仙题】P4151 [WC2011]最大XOR和路径

    Description 给定一个无向连通图,边有边权,求一个 \(1~\sim n\) 的路径,最大化边权的异或和.如果一条边经过多次则计算多次. Input 第一行是两个整数 \(n,m\) 代表点 ...

随机推荐

  1. C语言 两个小知识点

    strlen 函数原型 extern unsigned int strlen(char *s); 在Visual C++ 6.0中,原型为size_t strlen(const char *strin ...

  2. 微信JSSDK权限签名申请

    前提: 1.绑定域名 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”. 里边有说明(这里提示一点:需要把当前公众号的验证文件放到指定目录下) 2.需要参数: APPID. ...

  3. [LeetCode] “全排列”问题系列(一) - 用交换元素法生成全排列及其应用,例题: Permutations I 和 II, N-Queens I 和 II,数独问题

    一.开篇 Permutation,排列问题.这篇博文以几道LeetCode的题目和引用剑指offer上的一道例题入手,小谈一下这种类型题目的解法. 二.上手 最典型的permutation题目是这样的 ...

  4. 写文章 使用conda管理python环境

    使用conda管理python环境

  5. windows上使用wordpress搭建博客

    环境windows8.1 需要的工具:wampserver.wordpress 首先先下载好wordpress源码和wampserver安装包 安装完成后开启wampserver 开启的状态是绿色的: ...

  6. 对 JavaScript 进行单元测试的工具

    简介 单元测试关注的是验证一个模块或一段代码的执行效果是否和设计或预期一样.有些开发人员认为,编写测试用例浪费时间而宁愿去编写新的模块.然而,在处理大型应用程序时,单元测试实际上会节省时间:它能帮助您 ...

  7. [csp-201809-3]元素选择器-编译原理

    声明:同样是参考照抄hyh学长的代码!(有问题我马上删这篇emm 题目链接:http://118.190.20.162/view.page?gpid=T77 题面: 这棵树的样子(同样是来自学长的图) ...

  8. 【Project Euler】530 GCD of Divisors 莫比乌斯反演

    [题目]GCD of Divisors [题意]给定f(n)=Σd|n gcd(d,n/d)的前缀和F(n),n=10^15. [算法]莫比乌斯反演 [题解]参考:任之洲数论函数.pdf 这个范围显然 ...

  9. java学习笔记记录

    Java内存模型: Java虚拟机规范中将Java运行时数据分为六种. 1.程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址.Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间 ...

  10. 在Unity中实现屏幕空间反射Screen Space Reflection(3)

    本篇讲一下相交检测的优化.有两个措施. 线段相交检测 之前的检测都是检测光线的终点是否在物体内.我们可以尝试检测光线的线段是否与物体相交. 比如说有一个非常薄的物体,光线差不多垂直于它的表面.如果用普 ...