BZOJ 2115 Xor

Posted on 2016-05-28 17:10  ziliuziliu  阅读(137)  评论(0编辑  收藏  举报

找一条路+线性基。

#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;    
}