bzoj

luogu

sol

首先很显然的,答案等于1到n的任意一条路径的异或和与若干个环的异或和的异或和。

因为图是联通的,那么就可以从一个点走到任意一个想要走到的环上,走完这个环后原路返回,那么中间的路径刚好抵消,所以这样是成立的。

现在需要把所有环的异或和丢到一个线性基里面。在dfs的生成树上的每一条非树边(返祖边)都对应了一个环,直接丢进去就可以了。

code

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll gi()
{
ll x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
struct xxj{
ll p[70];
void insert(ll x)
{
for (int j=63;j>=0;--j)
{
if (!(x>>j)) continue;
if (!p[j]) {p[j]=x;return;}
x^=p[j];
}
}
ll query(ll x)
{
for (int j=63;j>=0;--j)
x=max(x,x^p[j]);
return x;
}
}S;
const int N = 1e5+5;
int n,m,to[N<<1],nxt[N<<1],head[N],cnt,vis[N];ll val[N<<1],dis[N];
void link(int u,int v,ll w){to[++cnt]=v;nxt[cnt]=head[u];val[cnt]=w;head[u]=cnt;}
void dfs(int u)
{
for (int e=head[u];e;e=nxt[e])
if (!vis[to[e]])
dis[to[e]]=dis[u]^val[e],vis[to[e]]=1,dfs(to[e]);
else S.insert(dis[to[e]]^dis[u]^val[e]);
}
int main()
{
n=gi();m=gi();
for (int i=1;i<=m;++i)
{
int u=gi(),v=gi();ll w=gi();
link(u,v,w);link(v,u,w);
}
dfs(1);printf("%lld\n",S.query(dis[n]));
return 0;
}

最新文章

  1. 利用FileSystemWatcher实现磁盘文件监控
  2. NOIP主要考查范围
  3. DOM+CSS3实现小游戏SwingCopters
  4. python sorted排序
  5. [python] No module named _sysconfigdata_nd
  6. XSS测试语句大全
  7. 构造函数继承关键apply call
  8. good page
  9. .net中XML的创建01(传统方法)
  10. mysql 分区和集群
  11. Android网络:开发浏览器(五)——功能完善之保存图片实现
  12. ARM裸编程系列---UART
  13. iOS8互动的新通知
  14. redis介绍。
  15. 使用JS通过正则限制input的输入
  16. C# 调用cmd.exe的方法
  17. react native android6+拍照闪退或重启的解决方案
  18. ES6(数组)
  19. 关于bytes和bytearray
  20. [No0000F8]override和new的区别

热门文章

  1. javaScript tips —— z-index 对事件机制的影响
  2. Java网络编程学习A轮_02_抓包分析TCP三次握手过程
  3. python selenium常用基本方法---H5和键盘鼠标操作
  4. iOS 和Android客户端测试区别整理ing
  5. UVA-11374 Airport Express (dijkstra+枚举)
  6. H3C Huawei 交换机 IPv6环境配置
  7. day21 git &amp; github + Celery 分布式任务队列
  8. 让你的ansible飞起来
  9. Docker的大坑小洼(二)
  10. 【Html 学习笔记】第六节——列表