[BZOJ 2115] Xor
Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2115
Algorithm:
此题一看到是求异或和最大问题的,立即想到使用线性基解题
最终结果发现是由任意一条1~N的路径和若干个环构成的
证明:
1、如果答案中有环不在任意选取的路径上,可以先走到环再走回来
由于异或的自反性,相当于只增加了环的异或和
2、如果答案中的1~N的路径不是这条,那么这条路径一定和当前任意选取的路径形成一个环
那么我们只要再增加这个环上的异或和,就相当于“更改路径”了
那么接下来,我们只要dfs找到所有的环并记录其异或和
选取任意一条1~N的路径作为初始值,和所有环形成的线性基贪心加合即可
Code:
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
typedef pair<ll,ll> P; inline ll read() //IO优化中的int要改为LL!!!
{
char ch;ll num,f=;
while(!isdigit(ch=getchar())) f|=(ch=='-');
num=ch-'';
while(isdigit(ch=getchar())) num=num*+ch-'';
return f?-num:num;
} #define F first
#define S second const int MAXN=5e4+;
const int MAXM=2e5+;
vector<P> G[MAXN];
int n,m;
bool vis[MAXN];
ll dist[MAXN],base[],cir[MAXM],res,cnt=; void dfs(int x)
{
vis[x]=true;
for(int i=;i<G[x].size();i++) //寻找返祖边
{
P v=G[x][i];
if(!vis[v.F]) dist[v.F]=dist[x]^v.S,dfs(v.F);
else cir[++cnt]=dist[x]^dist[v.F]^v.S;
}
} int main()
{
n=read();m=read();
for(int i=;i<=m;i++)
{
ll x=read(),y=read(),z=read();
G[x].push_back(P(y,z));
G[y].push_back(P(x,z));
}
dfs();res=dist[n]; for(int i=;i<=cnt;i++) //构建线性基
for(int j=;j>=;j--)
{
if(!(cir[i]>>j)) continue;
if(!base[j]){base[j]=cir[i];break;}
cir[i]^=base[j];
} for(int i=;i>=;i--) res=max(res,res^base[i]);
cout << res;
return ;
}
Review:
1、异或和MAX <-----> 线性基
2、解决有环问题时,不一定要找到所有的环
大多时候,只要找到dfs返祖边形成的环即可
此题是因为一个含有多条返祖边形成的环的异或和就等于几个“小环”的异或总和
3、充分利用异或的自反性
求解异或和问题中,环+异或可以实现“换路”、“远程加环”等操作
4、如果res的初始值不为0,在和线性基添加时不可以看到1就添加,MAX更稳妥
[BZOJ 2115] Xor的更多相关文章
- bzoj 2115 Xor - 线性基 - 贪心
题目传送门 这是个通往vjudge的虫洞 这是个通往bzoj的虫洞 题目大意 问点$1$到点$n$的最大异或路径. 因为重复走一条边后,它的贡献会被消去.所以这条路径中有贡献的边可以看成是一条$1$到 ...
- ACM学习历程—BZOJ 2115 Xor(dfs && 独立回路 && xor高斯消元)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2115 题目大意是求一条从1到n的路径,使得路径xor和最大. 可以发现想枚举1到n的所有路 ...
- BZOJ 2115 Xor(抑或值最大路径)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2115 题意:给出一个带权无向图.求一条1到n的路径使得路径上权值的抑或值最大? 思路:( ...
- BZOJ 2115 Xor(线性基)
题意:给定一个n<=50000个点m<=100000条边的无向联通图,每条边上有一个权值wi<=1e18.请你求一条从1到n的路径,使得路径上的边的异或和最大. 任意一条1到n的路径 ...
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
- BZOJ 2337 XOR和路径 | 高斯消元 期望 位运算
BZOJ 2337 XOR和路径 题解 这道题和游走那道题很像,但又不是完全相同. 因为异或,所以我们考虑拆位,分别考虑每一位: 设x[u]是从点u出发.到达点n时这一位异或和是1的概率. 对于所有这 ...
- bzoj 2115: [Wc2011] Xor xor高斯消元
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 797 Solved: 375[Submit][Status] ...
- BZOJ 2115: [Wc2011] Xor
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MB Submit: 2794 Solved: 1184 [Submit][Stat ...
- BZOJ 2115: [Wc2011] Xor DFS + 线性基
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MB Description Input 第一行包含两个整数N和 M, 表示该无向图中 ...
随机推荐
- [USACO08DEC] 秘密消息Secret Message
题目描述 Bessie is leading the cows in an attempt to escape! To do this, the cows are sending secret bin ...
- input 单选按钮radio 取消选中(转载)
input单选按钮: 在radio按钮中添加属性tag 0代表未被选中 HTML代码: <input name="rdo1" value="AA" ty ...
- 图论:Stoer-Wagner算法
利用Stoer-Wagner算法求无向图最小割 直接给出算法描述和过程实现: 算法步骤: . 设最小割cut=INF, 任选一个点s到集合A中, 定义W(A, p)为A中的所有点到A外一点p的权总和. ...
- 关于k Line Chart (k线图)
K Line Chart python实现k线图的代码,之前找过matplotlib中文文档但是画k线图的finance方法已经弃用了.所以自己在网上搜寻一下加上改编,很好的实现出k线图, 代码如下: ...
- hdu 2016 数据的交换输出
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2016 题目大意:把最小的和第一个交换并输出.注意格式哦! #include <stdio.h&g ...
- 【Mysql优化】索引优化策略
1:索引类型 1.1 B-tree索引 注: 名叫btree索引,大的方面看,都用的平衡树,但具体的实现上, 各引擎稍有不同, 比如,严格的说,NDB引擎,使用的是T-tree Myisam,in ...
- 会话Cookie
Cookie分为会话Cookie和本地Cookie两种 之前一直理解的是会话Cookie不在本地文件存储,只存储于内存,而本地Cookie因为设置了expire过期时间需要在本地存储 下面是白帽子讲W ...
- Linux MMC介绍
1. 介绍 Linux中,将包括MMC.SD.SDIO统称为MMC子系统 MMC子系统从功能上可分为三个层次 - card层: Card驱动, 或称client驱动 - core层: MMC的核心层, ...
- vue+axios下载文件的实现
HTML代码: <el-button size="medium" @click="download">下载表格</el-button> ...
- Git-ssh登录github
生成你的ssh-key $ ssh-keygen -t rsa -b 4096 -C "SaphhireCastle@163.com" 默认目录为:/Users/you/id_r ...