最大xor路径(poj3764)
#include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; int d[6000000][2],cnt; struct edge { int to,w,next; edge(int x,int y,int z):to(x),w(y),next(z){} edge(){} }e[400005]; int num[100005],vis[100005],tot,head[100005]; void addedge(int from,int to,int w) { e[tot]=edge(to,w,head[from]); head[from]=tot++; } void dfs(int v,int w) { vis[v]=1; num[v]=w; for(int i=head[v];i!=-1;i=e[i].next) { if(!vis[e[i].to]) dfs(e[i].to,w^e[i].w); } } void add(int x) { int p=1; for(int i=30;i>=0;i--) { if(d[p][(x>>i)&1]==0) d[p][(x>>i)&1]=++cnt; p=d[p][(x>>i)&1]; } } int find(int x) { int p=1,ans=0; for(int i=30;i>=0;i--) { int t=(x>>i)&1; if(d[p][1^t]) { ans+=(1<<i); p=d[p][1^t]; } else p=d[p][t]; } return ans; } int main() { int n; while(scanf("%d",&n)!=EOF) { tot=0; memset(d,0,sizeof(d)); memset(vis,0,sizeof(vis)); memset(head,-1,sizeof(head)); cnt=1; for(int i=1;i<n;i++) { int x,y,w; scanf("%d%d%d",&x,&y,&w); addedge(x,y,w); addedge(y,x,w); } dfs(0,0); int ans=0; for(int i=0;i<n;i++) { add(num[i]); ans=max(ans,find(num[i])); } printf("%d\n",ans); } return 0; }