比赛 2025.5.4 评测结果 AAAAAAAAAA
题目名称 最大异或和路径 最终得分 100
用户昵称 djyqjy 运行时间 0.135 s
代码语言 C++ 内存使用 5.13 MiB
提交时间 2025-05-04 10:42:09
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int re()
{
    int f=1,num=0;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
    return num*f;
}
const int N=50010,M=100010,Z=62;
int ver[2*M],edge[2*M],nxt[2*M],hd[N];
int jsq=1;
inline void add_edge(int x,int y,int z)
{
    ver[++jsq]=y;
    edge[jsq]=z;
    nxt[jsq]=hd[x];
    hd[x]=jsq;
    ver[++jsq]=x;
    edge[jsq]=z;
    nxt[jsq]=hd[y];
    hd[y]=jsq;
    return;
}
int c[Z],dfn[N],dep[N],jsqdfn;
int n,m,ans;
void insert(int x)
{
    for(int i=61;i>=0;i--)
    {
        if((x>>i)&1)
        {
            if(c[i]) x^=c[i];
            else
            {
                c[i]=x;
                return;
            }
        }
    }
    return;
}
void dfs(int x)
{
    dfn[x]=++jsqdfn;
    for(int i=hd[x];i;i=nxt[i])
    {
        int y=ver[i];
        if(dfn[y]) insert(dep[x]^dep[y]^edge[i]);
        else dep[y]=dep[x]^edge[i],dfs(y);
    }
    return;
}
signed main()
{
    freopen("xorr.in","r",stdin);
    freopen("xorr.out","w",stdout);
    n=re();m=re();
    for(int i=1,x,y,z;i<=m;i++) x=re(),y=re(),z=re(),add_edge(x,y,z);
    dfs(1);ans=dep[n];
    for(int i=61;i>=0;i--) if(!((ans>>i)&1)&&c[i]) ans^=c[i];
    printf("%lld",ans);
    return 0;
}