找一条路+线性基。
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #define maxv 100050 #define maxe 400500 using namespace std; struct edge { long long v,w,nxt; }e[maxe]; long long n,m,x,y,z,g[maxv],nume=0,dis[maxv],a[maxe],cnt=0,ins[70]; bool vis[maxv]; void addedge(long long u,long long v,long long w) { e[++nume].v=v; e[nume].w=w; e[nume].nxt=g[u]; g[u]=nume; } void dfs(long long x) { for (long long i=g[x];i;i=e[i].nxt) { long long v=e[i].v; if (!vis[v]) { dis[v]=dis[x]^e[i].w; vis[v]=true; dfs(v); } else a[++cnt]=dis[x]^dis[v]^e[i].w; } } void get_ins() { for (long long i=1;i<=cnt;i++) { for (long long j=63;j>=0;j--) { if ((a[i]>>j)&1) { if (!ins[j]) { ins[j]=a[i]; break; } else a[i]^=ins[j]; } } } } int main() { scanf("%lld%lld",&n,&m); for (long long i=1;i<=m;i++) { scanf("%lld%lld%lld",&x,&y,&z); addedge(x,y,z); addedge(y,x,z); } dfs(1); get_ins(); long long ans=dis[n]; for (long long i=63;i>=0;i--) { if ((ans^ins[i])>ans) ans^=ins[i]; } printf("%lld\n",ans); return 0; }