트리 템플릿 제목의 직경
우리가 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 }