题目:
题解:
每一条通往终点的路径都可以由一条简单路径和若干个环表示出来
那这就是我们的思路了
随便找到一条简单路径,处理好上面的每一个环的异或值,然后就是求这条路径和哪些环的异或值会最大
线性基求异或值最大,注意时时刻刻的longlong
代码:
#include <cstdio>
#include <cstring>
#define LL long long
using namespace std;
const int N=1000005;
int tot,nxt[N],point[N],v[N],cnt,n;LL c[N],h[N],ans,a[N],b[70];
bool vis[N];
void addline(int x,int y,LL z)
{
++tot; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; c[tot]=z;
++tot; nxt[tot]=point[y]; point[y]=tot; v[tot]=x; c[tot]=z;
}
void dfs(int x)
{
if (x==n) ans=h[x];
for (int i=point[x];i;i=nxt[i])
if (vis[v[i]])
{
LL t=h[x]^c[i]^h[v[i]];
if (t) a[++cnt]=t;
}
else
{
vis[v[i]]=1;
h[v[i]]=h[x]^c[i];
dfs(v[i]);
}
}
int main()
{
int m;scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
int x,y;LL z;
scanf("%d%d%lld",&x,&y,&z);
addline(x,y,z);
}
vis[1]=1;dfs(1);
for (int i=1;i<=cnt;i++)
for (int j=60;j>=0;j--)
if (a[i]>>j&1)
{
if (!b[j]) {b[j]=a[i]; break;}
else a[i]^=b[j];
}
for (int i=60;i>=0;i--)
if ((ans^b[i])>ans) ans^=b[i];
printf("%lld\n",ans);
}