BZOJ 2115 [Wc2011] Xor
阿新 • • 發佈:2018-02-21
amp void for cloc 最大路 == while log --
題解: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; }
BZOJ 2115 [Wc2011] Xor