传送门biu~
我们可以先dfs求出图中的所有环,显然在从1走到n的过程中可以随意获得任意环的异或和。所以把环的异或和都求出来,再随意选择一条从1~n的路径。用线性基求解。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int head[50005],nex[200005],to[200005],tp;
long long val[200005],dis[50005],a[64];
stack<long long>data;
bool b[50005];
inline void add(int x,int y,long long z){
nex[++tp]=head[x];
head[x]=tp;
to[tp]=y;
val[tp]=z;
}
void dfs(int x){
b[x]=1;
for(int i=head[x];i;i=nex[i]){
if(b[to[i]]){
data.push(dis[x]^dis[to[i]]^val[i]);
if(!data.top()) data.pop();
}
else{
dis[to[i]]=dis[x]^val[i];
dfs(to[i]);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
int x,y;
long long z;
scanf("%d%d%lld",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
dfs(1);
while(!data.empty()){
long long x=data.top();data.pop();
for(int i=63;i>=0;--i){
if(x>>i&1){
if(a[i]) x^=a[i];
else {a[i]=x;break;}
}
}
}
long long ans=dis[n];
for(int i=63;i>=0;--i)
if(!(ans>>i&1)) ans^=a[i];
printf("%lld",ans);
return 0;
}