#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 50010
#define M 100100
using namespace std;
typedef long long ll;
int n,m,cnt,tot;
struct node
{
int to,next;
ll val;
}edge[M<<1];
int head[N];
int vis[N];
ll dis[N];
ll circle[M<<1];
void init()
{
memset(head,-1,sizeof(head));
cnt=1;
}
void edgeadd(int from,int to,ll val)
{
edge[cnt].to=to,edge[cnt].val=val;
edge[cnt].next=head[from];
head[from]=cnt++;
}
void dfs(int now)
{
vis[now]=1;
for(int i=head[now];i!=-1;i=edge[i].next)
{
int to=edge[i].to;
if(vis[to])
{
if(!(dis[now]^dis[to]^edge[i].val))continue;
circle[++tot]=dis[now]^dis[to]^edge[i].val;
}else
{
dis[to]=dis[now]^edge[i].val;
dfs(to);
}
}
}
void gauss()
{
int flag=1,j;
for(ll i=(1ll<<62);i;i>>=1)
{
for(j=flag;j<=tot;j++)
{
if(circle[j]&i)break;
}
if(j==tot+1)continue;
swap(circle[flag],circle[j]);
flag++;
for(int k=1;k<=tot;k++)
{
if(k==flag-1)continue;
if(circle[k]&i)circle[k]^=circle[flag-1];
}
}
}
int main()
{
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
ll val;
scanf("%d%d%lld",&x,&y,&val);
edgeadd(x,y,val);
edgeadd(y,x,val);
}
dfs(1);
gauss();
for(int i=1;i<=tot;i++)
{
if((circle[i]^dis[n])>dis[n])dis[n]^=circle[i];
}
printf("%lld\n",dis[n]);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/wzq_qwq/article/details/46939319