La simple idea codiciosa de Trie, siempre que la ruta XOR sea el valor XOR de las dos rutas al nodo raíz, entonces el árbol Trie es codicioso
#include <iostream> #include <cstring> #include <cstdio> #include <map> #include <algorithm> #include <queue> #include < set > #define ull unsigned long long utilizando namespace std; typedef largo largo ll; typedef par < int , int > pll; typedef par < int , par < int , int >> plll; const int N = 3e5 + 10 ; const int inf = 0x3f3f3f3f ; int tr [ 3000001 ] [ 2 ]; int h [N], ne [N], e [N], w [N], idx; int cnt; int sum [N]; void add ( int a, int b, int c) { e [idx] = b, ne [idx] = h [a], w [idx] = c, h [a] = idx ++ ; } Void DFS ( int u, int res, int FA) { int i; suma [u] = res; para (i = h [u]; i! = - 1 ; i =ne [i]) { int j = e [i]; si (j == fa) continúa ; int c = w [i]; dfs (j, res ^ c, u); } } void insert ( int x) { int i; int cur = 0 ; para (i = 30 ; i> = 0 ; i-- ) { int num = x >> i & 1 ; if (tr [cur] [num] == 0 ) tr [cur] [num] = ++ cnt; cur = tr [cur] [num]; } } int search ( int x) { int cur = 0 ; int i; int res = 0 ; para (i = 30 ; i> = 0 ; i-- ) { int num = x >> i & 1 ; if (tr [cur] [num ^ 1 ]) { res + = 1 << i; cur = tr [cur] [num ^ 1 ]; } más { cur =tr [cur] [num]; } } return res; } int main () { memset (h, - 1 , tamaño de h); int n; cin >> n; int i; para (i = 1 ; i <n; i ++ ) { int u, v, c; scanf ( " % d% d% d " , & u, & v, & c); agregar (u, v, c); agregar (v, u, c); } dfs ( 1 , 0 , - 1 ); para (i = 0 ; i <n; i ++ ) { insert (sum [i]); } int res = 0 ; para (i = 0 ; i <n; i ++ ) { res = max (res, search (sum [i])); } cout << res << endl; }