[POJ3764]The xor-longest Pat【Trie】
阿新 • • 發佈:2018-07-11
cin 求最大值 poj n) pan else if () dfs while
- [POJ3764]The xor-longest Path
題目大意:給出一棵有\(N\)個節點的樹,樹上每條邊都有一個權值。從樹中選擇兩個點\(x\)和\(y\),把\(x\)到\(y\)的路徑上的所有邊權\(xor\),求最大值(\(N\le {10}^5\))
令\(d[x]\)為\(x\)到根的路徑\(xor\),易得\(xor_{x->y}=d[x]\; xor\; d[y]\),問題就轉化為求最大的\(d[x]\; xor\; d[y]\).按位貪心就好
int ch[Maxm][2], cnt; void cal(int x){ int now=0, p=0; for(int j=30; j >= 0; j--){ int k=(x&(1<<j)) ? 0 : 1; if(ch[now][k]) now=ch[now][k], p+=1<<j; else if(ch[now][k^1]) now=ch[now][k^1]; else break; } ans=max(ans, p); } void ins(int x){ int now=0; for(int i=30, v; i >= 0; i--) v=(x&(1<<i)) ? 1 : 0, now=ch[now][v]=ch[now][v] ? ch[now][v] : ++cnt; } void dfs(int u, int fa){for(int i=head[u], v; i; i=nxt[i]) if((v=to[i]) != fa) d[v]=d[u]^w[i], dfs(v, u);} void solve(){ while(cin>>n){ mem(head, 0); mem(nxt, 0); tot=0; mem(ch, 0); cnt=0; mem(d, 0); ans=0; for(int i=1, u, v, ww; i < n; i++) u=read()+1, v=read()+1, ww=read(), add(u, v, ww), add(v, u, ww); dfs(1, 0); for(int i=1; i <= n; i++) ins(d[i]); for(int i=1; i <= n; i++) cal(d[i]); printf("%d\n", ans); } }
[POJ3764]The xor-longest Pat【Trie】