BZOJ 2115 [Wc2011] Xor
题解:xor最大路径一定是几个环加上从1到n的路径
环用tarjan处理
最大xor和用线性基处理
喵啊
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long Lint; const int maxn=50007; int n,m; Lint ans; int cntedge; int head[maxn]; int to[maxn<<2],nex[maxn<<2]; Lint dist[maxn<<2]; void Addedge(int x,int y,Lint z){ nex[++cntedge]=head[x]; to[cntedge]=y; dist[cntedge]=z; head[x]=cntedge; } Lint p[maxn]; int dfsclock; int pre[maxn],lowlink[maxn]; Lint depth[maxn]; void Dfs(int u,int fa){ pre[u]=lowlink[u]=++dfsclock; for(int i=head[u];i;i=nex[i]){ if(to[i]==fa)continue; if(!pre[to[i]]){ depth[to[i]]=depth[u]^dist[i]; Dfs(to[i],u); lowlink[u]=min(lowlink[u],lowlink[to[i]]); }else{ lowlink[u]=min(lowlink[u],pre[to[i]]); Lint x=depth[u]^depth[to[i]]^dist[i]; for(int j=62;j>=1;--j){ if(x&(1LL<<(j-1))){ if(p[j]){ x^=p[j]; }else{ p[j]=x;break; } } } } } } int main(){ scanf("%d%d",&n,&m); while(m--){ int x,y;Lint z; scanf("%d%d%lld",&x,&y,&z); Addedge(x,y,z);Addedge(y,x,z); } Dfs(1,0); ans=depth[n]; for(int j=62;j>=1;--j){ if((ans^p[j])>ans)ans=(ans^p[j]); } cout<<ans<<endl; return 0; }
致歉:笔者已经意识到这是一篇几乎没有价值的文章,给您的阅读带来不好的体验,并且干扰了您的搜索环境,非常抱歉!