144. 最长异或值路径 ###K ###K //K

题目链接:https://www.acwing.com/problem/content/description/146/

思路:考虑 固定1为根  有节点a,b a到1的路径之间的异或值和b到1之间的异或值相异或的话

得到的结果就是a到b路径的异或值 画图就可以理解 所以题目可以转换成用dfs求出

根1到所有节点的异或值a[i] 然后求这些a[i]中 某两个组合的最大值 就变成01trie的模板题了

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define pi pair<int,int>
 5 #define pb push_back
 6 #define fi first
 7 #define sc second
 8 #define ull unsigned long long
 9 const int maxn=1e5+10;
10 const int mod=1e9+7;
11 
12 
13 int tr[maxn*31][2];
14 vector<pi>E[maxn];
15 int a[maxn];
16 
17 void dfs(int u,int fa)
18 {
19     a[u]^=a[fa];
20     for(auto &v:E[u])
21     {
22         if(v.fi==fa) continue;
23         a[v.fi]=v.sc;
24         dfs(v.fi,u);
25     }
26 }
27 
28 int tot;
29 void add(int x)
30 {
31     int p=0;
32     for(int i=30;i>=0;i--)
33     {
34         int u=x>>i&1;
35         if(!tr[p][u]) tr[p][u]=++tot;
36         p=tr[p][u];
37     }
38 }
39 int query(int x)
40 {
41     int ans=0,p=0;
42     for(int i=30;i>=0;i--)
43     {
44         int u=x>>i&1;
45         if(tr[p][!u]) p=tr[p][!u],ans+=1<<i;
46         else p=tr[p][u];
47     }
48     return ans;
49 }
50 
51 int main()
52 {
53     ios::sync_with_stdio(0);
54     cin.tie(0);
55     int n;
56     cin>>n;
57     for(int i=1;i<n;i++)
58     {
59         int u,v,w;
60         cin>>u>>v>>w;
61         u++;
62         v++;
63         E[u].pb({v,w});
64         E[v].pb({u,w});
65     }
66     dfs(1,0);
67     int mx=0;
68     for(int i=1;i<=n;i++)
69     {
70         add(a[i]);
71         mx=max(mx,query(a[i]));
72     }
73     cout<<mx<<'\n';
74 
75 
76 }
View Code

 

posted @ 2021-04-02 19:43  canwinfor  阅读(99)  评论(0)    收藏  举报