bzoj2115 [ WC2011 ] -- 线性基

来源:互联网 发布:怎么联系淘宝达人合作 编辑:程序博客网 时间:2024/06/05 15:25

如果从点i走到某个环上的点j,绕环一圈,再走回来,那么从i走到j的路径就被抵消了。相当于只走了环上的点。那么答案就是一条1n的路径与若干个环的异或和的最大值,线性基即可。

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 100010#define M 63#define ll long longstruct Edge{    int t,nx;    ll w;}e[N<<1];ll a[M],z,Ans,d[N];int i,j,k,n,m,t,h[N],x,y,Cnt;bool b[N];inline void Add(int x,int y,ll z){    e[++Cnt].t=y;e[Cnt].nx=h[x];e[Cnt].w=z;h[x]=Cnt;}inline void Insert(ll x){    for(int i=M-1;i;i--)    if((x>>i-1)&1)    if(!a[i]){        a[i]=x;        break;    }else x^=a[i];}inline void Dfs(int x){    b[x]=1;    for(int i=h[x];i;i=e[i].nx){        if(!b[e[i].t])d[e[i].t]=d[x]^e[i].w,Dfs(e[i].t);else        Insert(d[e[i].t]^d[x]^e[i].w);    }}int main(){    scanf("%d%d",&n,&m);    for(i=1;i<=m;i++)scanf("%d%d%lld",&x,&y,&z),Add(x,y,z),Add(y,x,z);    Dfs(1);    for(Ans=d[n],i=M-1;i;i--)    if((a[i]^Ans)>Ans)Ans^=a[i];    printf("%lld\n",Ans);    return 0;}
原创粉丝点击