나무 감안할 때, 나무는 가장자리의 무게가있다.
XOR 트리 경로 길이는 XOR 및 경로의 모든 모서리의 무게로 정의된다 :
⊕ XOR의 상징이다.
위에서 주어진 n 개의 노드가 트리에, 당신은 다른 경로 또는 그것의 최대 길이를 찾을 수 있습니까?
입력 형식
첫 번째 행은 정수 n, 트리의 노드의 수를 포함합니다.
에지 중량 w이고 V 다음에, N-1 로우는 3 개 개의 정수를 각각 포함하는 열은, u, v, w는이 노드와 노드 U 사이에 나타냈다.
출력 형식
정수 출력은 최대 경로 길이 XOR XOR 및 최대 값을 나타낸다.
데이터 범위
1 ≤ N ≤ 100,000 1≤n≤100000,
0 ≤ U , V < N 0≤u, V <N,
0 ≤ w < 2 31 0≤w <231
샘플 입력 :
4
0 1 3
1 2 4
1 3 6
샘플 출력 :
7
샘플 해석
샘플은 긴 경로해야 0-> 1-> 2, 7 (= 3 ⊕ 4)의 값을 XOR 연산
알고리즘 : DFS + 01 트라이
해결책 : D 세트는 [X] 명확 경로 X, 모든 루트 노드의 에지 웨이트 XOR 값을 나타낸다 :
D [X] = D [아버지 (X)] XOR 중량 (X, 아버지 (X))
상기 방정식에 따라, 우리는 각각의 경로를 기록 하였다 루트로부터 이송, DFS를 사용할 수있다.
및 동일 또는 상이하여 두 값 [X] D 어레이의 요구로 한 후, 0이 가장 전용선 또는 동일한 (또는 다른 최대 상을 같이 https://www.cnblogs.com/buhuiflydepig /p/11306057.html ).
당신은 나무는 것을 알 필요가있다.
예를 들어 : 0 -> 1 -> 2 - 결과>도 5는 4이고, 다음 [5] D에 보관.
- 0 결과> (1) (1) [1]에서의 D의 존재이다.
이제 1 항해야 - 결과> (5)를, 그것만큼 그대로 D [1] ^ D [5] 제로 동일한 XOR은 이러한 특성에 따라, 결과를 인출 할 수있는 선에서.
사용법 #include <iostream> #INCLUDE <cstdio> #INCLUDE <벡터> 사용 스페이스 성병; CONST의 INT maxn 1E5 + = 7 ; 벡터 <쌍 < INT , INT >> g [maxn]; INT의 트리 [maxn * 32 ] [ 2 ]; INT D [maxn]; INT의 어린 아이; 보이드 DFS는 ( int로 , U을 int로 FA)을 { INT LEN = g [U] 크기는 (); 위한 ( int로 I = 0 ; I <렌; 내가 ++ ) { 쌍 < INT , INT > V = g [U] [I]; 만약 (! = v.first FA) { D [v.first] = D [유] ^ v.second; DFS (v.first, U); } } } 공극 인서트 ( INT X) { INT의 루트 = 0 ; 위한 ( int로 난 = 30 , I> = 0 ; 난 ... ) { INT IDX = (X >> I) 1 ; 경우 (트리 [루트] [IDX] == 0 ) { 트리 [루트] [IDX] = ++ 어린 아이; } 루트 = 트리 [루트] IDX]; } } INT의 검색 ( INT X) { INT의 루트 = 0 ; INT 입술 = 0 ; 위한 ( int로 난 = 30 , I> = 0 ; 난 ... ) { INT IDX = (X >> I) 1 ; 경우 (트리 [루트] [ 1 ^ IDX]! = 0 ) { 루트 = 트리 [루트] [ 1 ^IDX]; 입술 | = ( 1 << I); } 다른 { 루트 = 나무 [루트] [IDX] } } 반환 입술을; } INT 의 main () { INT의 N; scanf와 ( " %의 D ' , N); 위한 ( int로 I = 0 ; i가 N <- 1 ] 나가 ++ ) { int로 U를, V, w; scanf와 ( " % D % D % D ' , U, V, W); g [U] .push_back (make_pair (V) w); g [V] .push_back (make_pair (U, w)); } DFS ( 0 - 1 ); INT ANS = 0 ; 위한 ( int로 I = 0 ; I <N이 나 ++ ) { 인서트 (d [I]); ANS = 최대 (ANS 검색 (d [I])); } COUT << ANS << ENDL; 반환 0 ; }