【分析】
最大化路径异或和…
我们可以先瞎胡dfs一遍找一条路…并搞出来所有的环。
然后发现每个环可以走或者不走 = =
最大化环的异或就用到线性基了…
方法是从高位往低位逐位贪心。
【代码】
//bzoj 2115 [Wc2011] Xor
#include<bits/stdc++.h>
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(i=j;i<=k;i++)
using namespace std;
const int mxn=200005;
bool vis[mxn];
int head[mxn];
int n,m,cnt,num;
ll ans,xo[mxn],circle[mxn],p[105];
struct edge {int to,next;ll w;} f[mxn<<1];
inline void add(int u,int v,ll w)
{
f[++cnt].to=v,f[cnt].w=w,f[cnt].next=head[u],head[u]=cnt;
}
inline void dfs(int u)
{
vis[u]=1;
for(int i=head[u];i;i=f[i].next)
{
int v=f[i].to;
if(!vis[v]) xo[v]=xo[u]^f[i].w,dfs(v);
else circle[++num]=xo[u]^xo[v]^f[i].w;
}
}
int main()
{
int i,j,u,v;ll w;
scanf("%d%d",&n,&m);
fo(i,1,m)
{
scanf("%d%d%lld",&u,&v,&w);
add(u,v,w),add(v,u,w);
}
dfs(1),ans=xo[n];
fo(i,1,num)
{
for(j=62;j>=0;j--)
{
if(!(circle[i]>>j)) continue;
if(!p[j]) {p[j]=circle[i];break;}
circle[i]^=p[j];
}
}
for(j=62;j>=0;j--) if((ans^p[j])>ans) ans^=p[j];
printf("%lld\n",ans);
return 0;
}