valores de las rutas más larga XOR

# Significado del título
dado un árbol de n nodos, el árbol tiene un lado peso, elija dos puntos cualesquiera del árbol, encontrar los dos puntos en el camino del valor máximo de la exclusiva o hasta

# Explicaciones

La matriz D [x] xor denota el valor del nodo raíz a todos los lados en el camino correcto x, y la estructura es un árbol, todos los nodos determinados por dfs d
determinar todas matriz D, el nodo x al nodo y todos XOR es el peso D [x] xor D [Y ], si no se aparten de la raíz de la duda

Si un nodo es un nodo de antepasado a otro nodo, de acuerdo con la naturaleza de la XOR puede ser compensado de la raíz a la trayectoria de nodo antepasado común
del problema original se convierte en D [1] ~ [n] D seleccionar cualquiera de los dos números, el máximo buscan XOR.

1 #include <bits / STDC ++ h.>
 2  usando  espacio de nombres std;
3  const  int N = 1e5 + 10 ;
4  int n;
5  int h [N], e [N * 2 ], ne [N * 2 ], w [N * 2 ], idx;
6  int d [N];
7  int trie [N * 31 ] [ 2 ], tot = 1 ;
8 inline void add ( int x, int y, int z) {
 9      e [idx] = y;
10      w [idx] = z;
11      ne [idx] = h [x];
12      h [x] = idx ++ ;
13  }
 14 inline int dfs ( int u, int f, int suma) {
 15      d [u] = suma;
16      para ( int i = h [u]; i = - 1 ; i = ne [i]) {
 17          int j = e [i];
18          Si (j = f!) Dfs (j, u, suma ^ w [i]);
19      }
 20  }
 21 inline void inserto (int x) {
 22      int p = 1 ;
23      para ( int j = 30 ; j> = 0 ; j-- ) {
 24          int ch = (x >> j) y 1 ;
25          si (! Trie [p] [ch])
 26              trie [p] [ch] = ++ tot;
27          p = trie [p] [ch];
28      }
 29  }
 30 inline int búsqueda ( int x) {
 31      int res = 0 ;
32      int p =1 ;
33      para ( int i = 30 ; i> = 0 ; i-- ) {
 34          int ch = x >> i y 1 ;
35          Si (trie [p] [! Ch]) {
 36              res + = 1 << i;
37              p = trie [p] [! ch];
38          }
 39          más 
40              p = trie [p] [ch];
41      }
 42      de retorno res;
43  }
 44  int main () {
 45     ios :: sync_with_stdio ( 0 );
46      cin.tie ( 0 );
47      cout.tie ( 0 );
48      memset (h, - 1 , sizeof h);
49      cin >> n;
50      para ( int i = 0 ; i <n; i ++ ) {
 51          int u, v, w;
52          cin >> T >> >> v w;
53          add (u, v, w);
54          add (v, u, w);
55      }
 56      dfs ( 0 , - 1 , 0);
57      int ans = 0 ;
58      para ( int i = 0 ; i <n; i ++ )
 59      {
 60          inserto (d [i]);
61          ans = max (ans, búsqueda (d [i]));
62      }
 63      tribunal << ans;
64 }

 

 

 

Supongo que te gusta

Origin www.cnblogs.com/hhyx/p/12556501.html
Recomendado
Clasificación