bzoj 2115 [Wc2011] Xor——路径和环的转化
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115
思路很精妙。好像能应用到很多地方。
发现如果路径上有环,可以通过一些走法达到 异或了那个环 或 没有异或那个环。
所以路径上如果有环,可以把它们的异或值都存下来,之后随便挑选。
发现所有1~n的路径互相成环。
这样就能随便找一条路径,然后把所有环的异或值存下来,用高斯消元随便挑选。
消元的时候尽量保留高位,而且要上下消,这样保留下来的每一行的首位就不会被其他行的挑选情况影响。
注意挑选的时候是取max,不是 | 什么的。
1.找环,可以先弄个生成树,然后每条非树边成环。也可以在dfs里顺便判断。
2.左移是 1ll !!!
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=5e4+,M=1e5+,LM=;
int n,m,head[N],xnt=,tot,fa[N];
ll dis[N],ml,a[M];
bool vis[M<<],/*vis[N],*/flag;
struct Ed{
int next,fr,to;ll w;
Ed(int n=,int f=,int t=,ll w=):next(n),fr(f),to(t),w(w) {}
}ed[M<<];
void add(int x,int y,ll z)
{
ed[++xnt]=Ed(head[x],x,y,z);head[x]=xnt;
ed[++xnt]=Ed(head[y],y,x,z);head[y]=xnt;
}
int find(int a){return fa[a]==a?a:fa[a]=find(fa[a]);}
void dfs(int cr,int f)
{
for(int i=head[cr],v;i;i=ed[i].next)
if(vis[i]&&(v=ed[i].to)!=f)
{
dis[v]=(dis[cr]^ed[i].w);
dfs(v,cr);
}
}
void sc()
{
for(int i=;i<=n;i++)fa[i]=i;
int lm=(m<<);
for(int i=;i<=lm;i+=)
if(find(ed[i].fr)!=find(ed[i].to))
{
vis[i]=vis[i^]=;fa[find(ed[i].fr)]=find(ed[i].to);
}
dfs(,);
for(int i=;i<=lm;i+=) if(!vis[i])
a[++tot]=(dis[ed[i].fr]^dis[ed[i].to]^ed[i].w);
}
//void dfs(int cr,int f)
//{
// vis[cr]=1;
// for(int i=head[cr],v;i;i=ed[i].next)
// if((v=ed[i].to)!=f)
// if(!vis[v]){
// dis[v]=(dis[cr]^ed[i].w);dfs(v,cr);
// }
// else a[++tot]=(dis[cr]^dis[v]^ed[i].w);
//}
int ws(ll x)
{
int ret=;for(;x;ret++)x>>=;return ret;
}
void gauss()
{
int now;
for(int i=;i<=tot;i++)
{
if(!a[i])break;
int nw=i;
for(int j=i+;j<=tot;j++)if(a[j]>a[nw])nw=j;//>a[nw],不是a[i]...
if(nw!=i)swap(a[i],a[nw]);
now=ws(a[i])-;
for(int j=;j<=tot;j++)if(i!=j&&(a[j]&(1ll<<now)))a[j]^=a[i];//上下消 //1ll
}
}
//void gauss()
//{
// int nw=0;
// for(int i=60;i>=0;i--)
// {
// int j=nw+1;
// for(;j<=tot&&(a[j]&(1ll<<i))==0;j++);//1ll!!!
// if(j==tot+1)continue;
// nw++;
// swap(a[nw],a[j]);
// for(int j=1;j<=tot;j++)if(j!=nw&&(a[j]&(1ll<<i)))a[j]^=a[nw];
// }
//}
int main()
{
scanf("%d%d",&n,&m);int x,y;ll z;
for(int i=;i<=m;i++)
{
scanf("%d%d%lld",&x,&y,&z);add(x,y,z);
}
sc();/*dfs(1,0);*/ml=dis[n];//不用再dfs一遍求ml
gauss();
for(int i=;i<=tot;i++)ml=max(ml,ml^a[i]);//要这样!
printf("%lld\n",ml);
return ;
}
bzoj 2115 [Wc2011] Xor——路径和环的转化的更多相关文章
- bzoj 2115 [Wc2011] Xor 路径最大异或和 线性基
题目链接 题意 给定一个 \(n(n\le 50000)\) 个点 \(m(m\le 100000)\) 条边的无向图,每条边上有一个权值.请你求一条从 \(1\)到\(n\)的路径,使得路径上的边的 ...
- 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, 表示该无向图中 ...
- 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 DFS+高斯消元
标题效果:鉴于无向图.右侧的每个边缘,求一个1至n路径,右上路径值XOR和最大 首先,一个XOR并能为一个路径1至n简单的路径和一些简单的XOR和环 我们开始DFS获得随机的1至n简单的路径和绘图环所 ...
- BZOJ 2115: [Wc2011] Xor [高斯消元XOR 线性基 图]
啦啦啦 题意: N 个点M条边的边带权的无向图,求1到n一条XOR和最大的路径 感觉把学的东西都用上了.... 1到n的所有路径可以由一条1到n的简单路径异或上任意个简单环得到 证明: 如果环与路径有 ...
- BZOJ.2115.[WC2011]Xor(线性基)
题目链接 \(Description\) 给定一张无向带边权图(存在自环和重边).求一条1->n的路径,使得路径经过边的权值的Xor和最大.可重复经过点/边,且边权和计算多次. \(Soluti ...
- bzoj 2115: [Wc2011] Xor【线性基+dfs】
-老是想到最长路上 其实可以这样:把每个环的xor和都存起来,然后任选一条1到n的路径的xor和ans,答案就是这个ans在环的线性基上跑贪心. 为什么是对的--因为可以重边而且是无相连通的,并且对于 ...
- BZOJ 2115 [Wc2011] Xor ——线性基
[题目分析] 显然,一个路径走过两边是不需要计算的,所以我么找到一条1-n的路径,然后向该异或值不断异或简单环即可. 但是找出所有简单环是相当复杂的,我们只需要dfs一遍,找出所有的环路即可,因为所有 ...
随机推荐
- @MarkFan 口语练习录音 20140423 [风雨哈佛路.Homeless To Harvard口语录音]
世界在转动,你只是一粒尘埃 没有你,世界照样在转 现实不会按照你的意识去改变的 一些人的需求 一些人的意志要比你更强 严酷的生活会让人不知所措 所以他们久久地困在挫败中 我们生气地抱怨,而对整体的形势 ...
- INSPIRED启示录 读书笔记 - 第3章 产品管理与项目管理
互联网让两者变得不同 在传统的零售软件领域,产品经理常常兼任项目经理的工作,随着互联网的发展,两者的职责区别也越来越明显 产品管理的职责是探索(定义)有价值的.可用的.可行的产品 项目管理的职责是关注 ...
- 机器学习性能指标之ROC和AUC理解与曲线绘制
一. ROC曲线 1.roc曲线:接收者操作特征(receiveroperating characteristic),roc曲线上每个点反映着对同一信号刺激的感受性. 横轴:负正类率(false po ...
- linux输入子系统简述【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/7678035 1,linux输入子系统简述 其实驱动这部分大多还是转载别人的,linux ...
- utf-8,Unicode和ASCII区别
一.ASCII 码 我们知道,计算机内部,所有信息最终都是一个二进制值.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个 ...
- Ansi 与 Unicode 字符串类型的互相转换
WideCharToMultiByte 实现宽字节转换到窄字节MultiByteToWideChar 实现窄字节转换到宽字节 WideCharToMultiByte 的代码页用来标记与新转换的字符串相 ...
- hdoj1006--Tick and Tick
Problem Description The three hands of the clock are rotating every second and meeting each other ma ...
- IDEA字体设置
最近编码总是把","和"."搞错,字体实在是太小了,看不清,而且g的显示各个字体显示也是不一样,看的十分难受,果断换字体.分享一下在IDEA2017.2.5中如 ...
- jQuery Fancybox插件使用参数详解
Fancybox的特点如下: 可以支持图片.html文本.flash动画.iframe以及ajax的支持 可以自定义播放器的CSS样式 可以以组的形式进行播放 如果将鼠标滚动插件(mouse whee ...
- ansible实现发布、回滚功能
ansible的两篇博客,本来是打算合二为一的,发现只用一篇写,嗯,好鬼长.... 一向秉承简单为美的我于是忍痛割爱,一分为二了 ansible实现升级发布.回滚功能 1.应用场景 在实际生产环境中, ...