题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115

异或两次同一段路径的权值,就相当于没有走这段路径;

由此可以得到启发,对于不同的走法,也许只需要找出一些东西,就可以把所有的走法用它们来异或表示出来;

再关注图上的环路,因为从 1 到 n 的不同路径也可以看作是经由 1 和 n 连接的环路,路径上也可能有环路;

发现对于环路的不同走法,就是把路与环的权值异或求最优值,重叠的部分异或了两次相当于不走;

于是问题转化为找出图上的所有环(可以用 dfs ),把它们的权值异或起来得到最优解;

这里又有高斯消元求解线性基的套路,总之上就是了。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int const maxn=5e4+,maxm=1e5+;
int n,m,head[maxn],ct,cir;
ll ans,v[maxm<<],dis[maxn];//maxm<<1
bool vis[maxn];
struct N{
int to,next; ll w;
N(int t=,int n=,ll w=):to(t),next(n),w(w) {}
}edge[maxm<<];
void add(int x,int y,ll z){edge[++ct]=N(y,head[x],z); head[x]=ct;}
void dfs(int x)
{
vis[x]=;
for(int i=head[x],u;i;i=edge[i].next)
{
if(!vis[u=edge[i].to])
{
dis[u]=(dis[x]^edge[i].w);
dfs(u);
}
else v[++cir]=(dis[u]^dis[x]^edge[i].w);
}
}
void gauss()
{
int nw=;
for(int i=;i>=;i--)
{
// int j=++nw;//这样写会造成 nw 空加!
int j=nw+;
while(j<=cir&&(v[j]&(1ll<<i))==)j++;
if(j==cir+)continue;
nw++;
swap(v[nw],v[j]);
for(int j=;j<=cir;j++)
if(j!=nw&&(v[j]&(1ll<<i)))v[j]^=v[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); add(y,x,z);
}
dfs(); gauss();
ans=dis[n];
for(int i=;i<=cir;i++)
ans=max(ans,ans^v[i]);
printf("%lld",ans);
return ;
}

bzoj2115 [Wc2011] Xor——高斯消元 & 异或线性基的更多相关文章

  1. 【bzoj4568】[Scoi2016]幸运数字 树上倍增+高斯消元动态维护线性基

    题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游 ...

  2. 【bzoj4184】shallot 线段树+高斯消元动态维护线性基

    题目描述 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且 让小葱从自己手中的小 ...

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

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

  4. HDU3949:XOR(高斯消元)(线性基)

    传送门 题意 给出n个数,任意个数任意数异或构成一个集合,询问第k大个数 分析 这题需要用到线性基,下面是一些资料 1.高斯消元&线性基&Matirx_Tree定理 笔记 2.关于线性 ...

  5. BZOJ 2115: [Wc2011] Xor [高斯消元XOR 线性基 图]

    啦啦啦 题意: N 个点M条边的边带权的无向图,求1到n一条XOR和最大的路径 感觉把学的东西都用上了.... 1到n的所有路径可以由一条1到n的简单路径异或上任意个简单环得到 证明: 如果环与路径有 ...

  6. BZOJ 4004: [JLOI2015]装备购买 [高斯消元同余 线性基]

    和前两(一)题一样,不过不是异或方程组了..... 然后bzoj的新数据是用来卡精度的吧..... 所有只好在模意义下做啦 只是巨慢无比 #include <iostream> #incl ...

  7. HDU 3949 XOR [高斯消元XOR 线性基]

    3949冰上走 题意: 给你 N个数,从中取出若干个进行异或运算 , 求最后所有可以得到的异或结果中的第k小值 N个数高斯消元求出线性基后,设秩为$r$,那么总共可以组成$2^r$中数字(本题不能不选 ...

  8. HDU 3949 XOR 高斯消元

    题目大意:给定一个数组,求这些数组通过异或能得到的数中的第k小是多少 首先高斯消元求出线性基,然后将k依照二进制拆分就可以 注意当高斯消元结束后若末尾有0则第1小是0 特判一下然后k-- 然后HDU输 ...

  9. bzoj 2115: [Wc2011] Xor xor高斯消元

    2115: [Wc2011] Xor Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 797  Solved: 375[Submit][Status] ...

随机推荐

  1. 【转】C语言中access函数

    头文件:unistd.h 功 能: 确定文件或文件夹的访问权限.即,检查某个文件的存取方式,比如说是只读方式.只写方式等.如果指定的存取方式有效,则函数返回0,否则函数返回-1. 用 法: int a ...

  2. tomcat idea 报权限错误

    出现的错误提示如下: 下午9:11:27 All files are up-to-date下午9:11:27 All files are up-to-date下午9:11:27 Error runni ...

  3. 利用类装饰器自定制property实现延迟计算

    class LazyProperty: ''' hello,我是非数据描述符(没有定义__set__,不然是大哥数据描述符了--!) ''' def __init__(self, func): pri ...

  4. selenium3 简单使用

    from selenium import webdriverimport time browser = webdriver.Chrome()url = 'https://baidu.com' brow ...

  5. C语言学习6

    int i; 定义整形变量i int *p;  p为指向整型数据的指针变量 int a[n]: 定义整形数组a,他有n个元素 int *p[n]:   定义指针数组p,它有n个指向整型数据的指针元素组 ...

  6. CODE【VS】 3160 最长公共子串 (后缀数组)

    3160 最长公共子串 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入描述 Input Description 读入两个字符串 输出描述 Outp ...

  7. php的socket通信【转载】

     对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP?2.         Soc ...

  8. 04-js的运算符

    <html> <head> <title>js的运算符学习</title> <meta charset="UTF-8"/> ...

  9. Servlet的会话(Session)跟踪

    以下内容引用自http://wiki.jikexueyuan.com/project/servlet/session-tracking.html: HTTP是一种“无状态”协议,这意味着每次客户端检索 ...

  10. NA交换②

    虚拟局域网VLAN的核心目的:     将一个大的网络划分为小的网络,也称为网络分片(Segementation):一个VLAN对应着一个广播域,最好对应一个网络子网(为VLAN间的路由作准备).   ...