Description###

Input###

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

Output###

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

Sample Input###

5 7

1 2 2

1 3 2

2 4 1

2 5 1

4 5 3

5 3 4

4 3 2

Sample Output###

6

HINT###


想法##

手动画画图后可以发现,最终对答案有贡献的边为一条从1到n的路径,及若干个环。

于是我们可以dfs一遍,找到所有的简单环及一条路径。

(为什么一条路径就可以呢?因为一条路径与某些 包括这路径上某些边的 环 异或起来,新的对答案有贡献的边会形成另一条路径。)

线性基维护每个简单环的异或和。

在已经选了的这个路径的异或和基础上,线性基中找出总异或和的max


代码##

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; typedef long long ll;
const int N = 50005; struct node{
int v;
ll len;
node *next;
}pool[N*4],*h[N];
int cnt;
void addedge(int u,int v,ll len){
node *p=&pool[++cnt],*q=&pool[++cnt];
p->v=v; p->next=h[u]; h[u]=p; p->len=len;
q->v=u; q->next=h[v]; h[v]=q; q->len=len;
} ll C[65];
void ins(ll x){
if(!x) return;
for(int i=63;i>=0;i--){
if((x&(1ll<<i))==0) continue;
if(!C[i]) { C[i]=x; return; }
x^=C[i];
}
}
ll cal(ll ret) {
for(int i=63;i>=0;i--) ret=max(ret,ret^C[i]);
return ret;
} int vis[N];
ll d[N];
void dfs(int u){
int v;
vis[u]=1;
for(node *p=h[u];p;p=p->next){
v=p->v;
if(!vis[v]){
d[v]=d[u]^p->len;
dfs(v);
}
else if(vis[v]==1)ins(d[u]^d[v]^p->len);
}
vis[u]=2;
} int n,m; int main()
{
int u,v;
ll len;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d%d%lld",&u,&v,&len);
addedge(u,v,len);
} dfs(1);
printf("%lld\n",cal(d[n])); /*注意是在d[u]的基础上使异或和最大*/ return 0;
}

[bzoj2115] [洛谷P4151] [Wc2011] Xor的更多相关文章

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

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

  2. 洛谷P4151 [WC2011] 最大XOR和路径 [线性基,DFS]

    题目传送门 最大XOR和路径 格式难调,题面就不放了. 分析: 一道需要深刻理解线性基的题目. 好久没打过线性基的题了,一开始看到这题还是有点蒙逼的,想了几种方法全被否定了.还是看了大佬的题解才会做的 ...

  3. 洛谷P4151 最大XOR和路径 [WC2011] 线性基+图论

    正解:线性基+图论 解题报告: 传送门 首先可以思考一下有意义的路径会是什么样子,,,那就一定是一条链+一些环 挺显然的因为一条路径原路返回有没有意义辣?所以一定是走一条链+一些环(当然也可以麻油环, ...

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

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

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

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

  6. 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径

    //bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面 题面描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如 ...

  7. 【洛谷P2574】XOR的艺术

    XOR的艺术 题目链接 用线段树维护sum, 修改时 tag[p]^=1; sum=r-l+1-sum; 详见代码 #include<iostream> #include<cstdi ...

  8. 洛谷 [P4151] 最大异或和路径

    线性基 首先我们发现,对于一条路径走过去再走回来是没有意义的, 所以我们可以没有任何其他影响的取得一个环的异或和 所以我们预处理出来所有环的异或和,求出他们的线性基,然后任找一条 \(1 \sim n ...

  9. 洛谷P3211 [HNOI2011]XOR和路径(期望dp+高斯消元)

    传送门 高斯消元还是一如既往的难打……板子都背不来……Kelin大佬太强啦 不知道大佬们是怎么发现可以按位考虑贡献,求出每一位是$1$的概率 然后设$f[u]$表示$u->n$的路径上这一位为$ ...

随机推荐

  1. IDEA开发 工具IC和IU的区别

    现在很多人都在用IDEA开发工具,那么下载安装时会有ideaIU和ideaIC两个版本,到底该怎么选择呢? 首先: ideaIU:U代表的是Ultimate,这个是官方旗舰版也就是商用版本,官方只提供 ...

  2. CF1220

    CF1220 A one和zero特的字母分别是'n'和'z' 输出他们的数量即可 #include<cstdio> #include<iostream> #include&l ...

  3. Linux 内核类设备

    一个类的真正目的是作为一个是该类成员的设备的容器. 一个成员由 struct class_device 来表示: struct class_device { struct kobject kobj; ...

  4. eslint 错误提示

    “Missing semicolon.” : “缺少分号.”, “Use the function form of \”use strict\”.” : “使用标准化定义function.”, “Un ...

  5. 改变this指向

    fn.call(obj,参数,参数): call(函数执行过程中this指向,后面的参数就是原函数的参数列表) : 函数下的一个内置方法,当我们申明一个函数的时候,这个函数下就会有一个默认的方法,ca ...

  6. Java 学习笔记(4)——面向对象

    现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当初我很反感它的一点,当然现在也是很不喜欢 ...

  7. 【Docker】镜像基本操作

    1.镜像获取/生成 docker pull <image_name:tag> docker pull mysql:5.6 docker build -t <镜像名> <D ...

  8. 【Repo】repo sync:error.GitError: cannot initialize work tree

    1.Error Fetching projects: 100% (725/725), done. Checking out files: 100% (4605/4605), done.out file ...

  9. Helm Chart 一键部署 Jenkins

    Jenkins Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建.测试和部署软件.目前提供超过1000个插件来支持构建.部署.自动化, 满足任何项目的需要. Jenki ...

  10. .Net快速上手Nlog日志组件

    目录 一.NLog 简介 二.NLog 安装 三. NLog 配置 四.程序代码中写日志 五.参考 一.NLog 简介 NLog是适用于各种.NET平台的灵活,免费的日志记录平台.NLog使写入多个目 ...