트리 DFS의 poj1985의 두 배 직경

미국에서 비만의 유행에 대해들은 후, 농부 존은 더 운동을 자신의 소를 원하는, 그래서 그는 자신의 소를 실행하기위한 소 마라톤을 만들기 위해 최선을 다하고있다. 마라톤 경로 농장의 쌍 사이의 도로의 시퀀스로 이루어진 경로를 포함한다. FJ는 가능한 한 많은 운동을 얻기 위해 소를 원부터 그는 (두 농장 사이의 경로에 도로의 총 길이로 측정 된 거리) 서로 떨어져 멀리있는 그의지도에있는 두 개의 농장을 찾기를 원한다. 그 농장이 멀리 쌍 사이의 거리를 결정하는 데 도움을줍니다. 

입력

* 라인 1 ..... "탐색 악몽"과 동일 입력 형식.

산출

* 라인 1 : 농장의 가장 먼 쌍 사이의 거리를 표시하는 정수. 

샘플 입력

7 6 
1 6 E 13 
6 3 9 E 
3 5 7 S 
(4) 1 내지 3 N 
2 4 20 W 
4-7 S 2

샘플 출력

(52)

힌트

최장 마라톤 도로 4 팜 1 내지 5, 6, 3을 통해 팜 2에서 운영 및 길이 20 + 3 + 9 + 13 + 7 = 52이다. 
 
 
가장 먼 지점 DFS 기록에 어떤 점에서 성과는, 발견
그리고 처음부터 가장 먼 지점에서 DFS는 가장 먼 지점 직경 때까지
 
사용법 #include <iostream> 
#INCLUDE <cstdio> 
#INCLUDE <벡터> 
네임 스페이스를 사용하여 표준; 
CONST의 INT maxn 1E5 + = 10; 
INT 맥스 = 0; 
INT의 P; 
구조체 노드 { 
	INT의 Y; 
	INT 렌; 
	노드 (INT 증가한, INT lenn) { 
		Y = YY 렌 = lenn; 
	} 
}; 
벡터 <노드> S [maxn]; 
보이드 DFS는 (U에서 INT INT FA, INT DIS) { 
	대해 INT (I = 0; i가 S를 <[U] 크기는 (); 나는 ++) { 
		INT 브이가 S [U] [I] .Y; 
		INT LEN = S [U] [I] .LEN; 
		(V == FA)를 계속하는 경우; 
		DFS (V, U, DIS LEN +); 
	} 
	경우 (DIS> 맥스) { 
		맥스 = DIS, p = U; 
	} 
} 

INT의 main () { 
	INT의 N, m; 
	동안 (~는 scanf ( "% d 개 %의 D", 및 N, m)) {
		{위해 (; 나는 m <I ++는 I = 0 INT)
			A, B, C에서 INT; 
			숯 D; 
			scanf와 ( "% D % D % D % C '& A, B, C, D); 
			S [A] .push_back (노드 (b, c)); 
			S [B] .push_back (노드 (A, C)); 
		} 
		DFS (1,1,0); 
		맥스 = 0; 
		DFS (P, P, 0); 
		의 printf ( "% D \ 없음"맥스); 
	} 
	0을 반환; 
}

  

 

추천

출처www.cnblogs.com/lyj1/p/11369200.html