如果从点
i
走到某个环上的点
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100010
#define M 63
#define ll long long
struct Edge{
int t,nx;
ll w;
}e[N<<1];
ll a[M],z,Ans,d[N];
int i,j,k,n,m,t,h[N],x,y,Cnt;
bool b[N];
inline void Add(int x,int y,ll z){
e[++Cnt].t=y;e[Cnt].nx=h[x];e[Cnt].w=z;h[x]=Cnt;
}
inline void Insert(ll x){
for(int i=M-1;i;i--)
if((x>>i-1)&1)
if(!a[i]){
a[i]=x;
break;
}else x^=a[i];
}
inline void Dfs(int x){
b[x]=1;
for(int i=h[x];i;i=e[i].nx){
if(!b[e[i].t])d[e[i].t]=d[x]^e[i].w,Dfs(e[i].t);else
Insert(d[e[i].t]^d[x]^e[i].w);
}
}
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)scanf("%d%d%lld",&x,&y,&z),Add(x,y,z),Add(y,x,z);
Dfs(1);
for(Ans=d[n],i=M-1;i;i--)
if((a[i]^Ans)>Ans)Ans^=a[i];
printf("%lld\n",Ans);
return 0;
}