POJ3764 The xor-longest Path(Trie树)
生活随笔
收集整理的這篇文章主要介紹了
POJ3764 The xor-longest Path(Trie树)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目給一棵有邊權的樹,問樹上任意兩點路徑上的邊異或值最多是多少。
記錄每個點u到根路徑的異或值xor[u],那么任意兩點u、v路徑的異或值就是xor[u]^xor[v]。
于是這個問題就變成了從n個數中任取兩個數異或,求最大異或值,這是個經典的問題,用字典樹解決。
方法就是所有數的二進制形式構建成一棵01字典樹,枚舉每個數從字典樹中就能找到對應的最大的答案。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define MAXN 110000 6 struct Edge{ 7 int v,w,next; 8 }edge[MAXN<<1]; 9 int NE,head[MAXN]; 10 void addEdge(int u,int v,int w){ 11 edge[NE].v=v; edge[NE].w=w; edge[NE].next=head[u]; 12 head[u]=NE++; 13 } 14 int tn,ch[3300000][2]; 15 void insert(int a){ 16 int x=0; 17 for(int i=31; i>=0; --i){ 18 int y=(a>>i)&1; 19 if(ch[x][y]==0) ch[x][y]=++tn; 20 x=ch[x][y]; 21 } 22 } 23 int query(int a){ 24 int x=0,res=0; 25 for(int i=31; i>=0; --i){ 26 int y=((a>>i)&1)^1; 27 if(ch[x][y]) x=ch[x][y],res|=1<<i; 28 else x=ch[x][y^1]; 29 } 30 return res; 31 } 32 int val[MAXN]; 33 void dfs(int u,int w,int fa){ 34 val[u]=w; 35 insert(w); 36 for(int i=head[u]; i!=-1; i=edge[i].next){ 37 int v=edge[i].v; 38 if(v==fa) continue; 39 dfs(v,w^edge[i].w,u); 40 } 41 } 42 int main(){ 43 int n,a,b,c; 44 while(~scanf("%d",&n)){ 45 NE=0; 46 memset(head,-1,sizeof(head)); 47 for(int i=1; i<n; ++i){ 48 scanf("%d%d%d",&a,&b,&c); 49 addEdge(a,b,c); addEdge(b,a,c); 50 } 51 tn=0; 52 memset(ch,0,sizeof(ch)); 53 dfs(0,0,0); 54 int res=0; 55 for(int i=0; i<n; ++i){ 56 res=max(res,query(val[i])); 57 } 58 printf("%d\n",res); 59 } 60 return 0; 61 }?
轉載于:https://www.cnblogs.com/WABoss/p/5171265.html
總結
以上是生活随笔為你收集整理的POJ3764 The xor-longest Path(Trie树)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到例假的血是什么意思
- 下一篇: 【Objective-C】玩转OC:正式