【POJ1985】 암소 마라톤

트리 템플릿 제목의 직경

우리가 DFS 번이 차트 (나무)에 그리기 계속 한 후, SUM1 현재 노드에서 가장 긴 경로를 가고 그의 아들에게 정의하는 것은 몇 번 긴 경로 표시 SUM2 수있다. 우리는 먼저 현재 노드 SUM2 업데이트의 노드에 현재 경로 + SUM1 현재 경로의 시간 길이, 업데이트가 SUM1보다 큰 SUM2 경우, 우리는 그 값을 교환, 이것은 우리에게 계산 완료 후, 권리를 찾기 어렵지 않다와 ANS 대답은 (SUM1 + SUM2) 최대 후에 있도록 현재 노드의 아버지가, 자신의 SUM1에 돌려,이 알고리즘은 따라서 시간 복잡도는 O (N)이다, 다시 각 지점을 통과합니다.

1 #INCLUDE <iostream>
 2 #INCLUDE <cstdio>
 3 #INCLUDE <CString을>
 4 #INCLUDE <알고리즘>
 5  이용  스페이스 성병;
6 타입 정의  LL;
7  INT의 N, m;
8  구조체 에지 {
 9      INT 다음에, DIS;
10 }이 [ 100010 << 1 ];
11  의 INT NUM 머리 [ 100010 << 1 ];
12  INT의 F [ 100010 ], ANS;
(13)  무효(ADD 지능  에서 , INT 에, INT의 {DIS)
 14      [A [++ NUM] 다음 내용 = 헤드 로부터 ];
15      A [NUM] = .TO 하는 단계;
16      A [NUM] = .dis 용의 DIS;
17      헤드 [  ] = NUM;
18  }
 19  INT DFS ( INT U, INT FA) {
 20      INT의 SUM1 = 0 , SUM2 = 0 ;
(21)      에 대한이 ( int로 I = 헤드 [유] 나, 나는 = A [i]는 다음 내용)
 22          경우 ! (a [I] = .TOFA) {
 23              SUM2 = 최대 (SUM2, DFS (a [i]를 .TO, U) + A [i]를 .dis);
24              의 경우 (SUM2> SUM1) 스왑 (SUM1, SUM2);
25              ANS = 최대 (ANS, SUM1 + SUM2);
26          }
 27      리턴 SUM1;
28  }
 29  INT 의 main () {
 30      는 scanf ( " %의 D % d에 " , N, m);
(31)      에 대한이 ( 값 int = 1을 1 ; 나는 <= m; 내가 ++ ) {
 32          C 단계;
33          INT X, Y, Z;
34          CIN >> >> X Y Z >> >>기음;
(35)          추가 (X, Y, Z);
(36)          추가 (Y, X, Z);
37      }
 38      DFS ( 1 , 0 );
39      의 printf ( " % D \ 없음 " , ANS);
40      반환  0 ;
41 }
AC 코드

 

추천

출처www.cnblogs.com/shl-blog/p/10960990.html