AcWing :. 144 배타적 OR를 가장 긴 경로의 DFS (+ 01 트라이)

나무 감안할 때, 나무는 가장자리의 무게가있다.

XOR 트리 경로 길이는 XOR 및 경로의 모든 모서리의 무게로 정의된다 :

formula.png

⊕ 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 ; 
}

 

추천

출처www.cnblogs.com/buhuiflydepig/p/11307937.html