Диаметр дерева POJ 1985 Cow Marathon

Определение:

  Учитывая, дерево, дерево имеет вес каждого ребра, на расстояние, определенное между двумя дерева справа от пути, соединяющей две точки и ребра. Диаметр дерева называется расстояние между самыми дальними двумя узлами в дереве, путь, соединяющий две точки, называется самой длинной цепью дерева. Последний также может упоминаться как правило, в диаметре, то есть значение диаметра представляет собой концепцию, путь может быть от имени, что


Есть, как правило, два диаметра дерева метод для нахождения, по времени сложность О (п). Мы предполагаем, форму направленного дерева графа задается N N-1 точка краевых полос и хранится в соседней таблице.

Метод а: DP дерево

Преимущества: 1 простой код

   2 может обрабатывать самую длинную цепь каждого поддерева с корнем в текущей точке.

Недостатки: легко определить диаметр две конечные точки.

Акт II: дважды ДФС (BFS)

Преимущества: легко вычислить диаметр конкретного узла.

Недостатки: может только искать диаметр и расстояние.

 

Оказались не повторять их, это относительно просто, есть и в Интернете.

Титульный бой голый POJ 1985 Cow Marathon

#include <iostream> 
#include <cstdio> 
#include <CString> 
#include <очереди> с 
помощью патезрасе; 
#define R зарегистрировать 
#define LL долго долго 
инлайн буду читать () 
{ 
	LL аа = 0; символ куб.см = GetChar (); 
	в то время как (сс < '0' || сс> '9') = сс GetChar (); 
	в то время как (сс> = '0' && куб.см <= '9') 
		{аа = (аа << 3) + (аа << 1) + (сс ^ 48); сс = GetChar ();} 
	возвращение аа; 
} 
Const Int N = 1E6; 
INT TOT, вер [N << 1], NXT [N << 1], края [N << 1], первый [N]; 
рядный недействительными добавить (целое х, у INT, INT г) 
{ 
	вер [++ TOT] = у; NXT [TOT] = первый [х]; 
	Край [TOT] = г; первый [х] = TOT; вернуться; 
} 
Int N, F [N], ANS;
	для (R = INT я первый [х], V, I; г = NXT [I]) { 
		v = веры [I], если (v == метрономы) продолжить; 
		дп (v, х); 
		F [0] = тах (е [0], Р [х] + ж [v] + ребро [I]); 
		Р [х] = тах (Р [х], F [v] + ребро [I]); 
	} 
} 
Int дис [N], пи, PJ; 
недействительными ДФС (целое х, Int FA) 
{ 
	для (R INT I = первая [х], V, I; г = NXT [I]) { 
		v = вер [I], если (v == метрономы) продолжить; 
		дис [v] = дис [X] + край [I]; ДФС (V, х); 
		если (дис [рг] <дис [v]) = р ^ v; 
	} 
} 
Очереди <Int> й; 
недействительный BFS (INT х) 
{ 
	MemSet (DIS, -1, SizeOf (дис)); дис [х] = 0; 
	qi.push (х); 
	(! qi.empty ()) , а { 
		INT и = qi.front (); qi.pop (); 
		для (R = INT я первая [и], V, I; г = NXT [I]) { 
			v = вер [I], если (дис [v] = - 1!) продолжить;
			дис [v] = дис [и] + край [I]; qi.push (v); 
			если (дис [v]> дис [р ^]) = р ^ v; 
		} 
	} 
} 
INT основных () 
{ 
	п = следующим образом (); чтения (); 
	для (R INT = 1, х, у, г; <п; ++ я) { 
		х = следующим образом (); Y = следующим образом (); г = следующим образом (); 
		добавить (х, у, г), добавить (у, х, г); 
	} 
	F [0] = 0; дп (1,1); ANS = F [0]; // дп 
	
	дис [1] = 0; р ^ = 1; ДФС (1,1); р = рг; 
	дис [р] = 0; (ДФС пи, пи); ANS = дис [рг]; // ДФС 
	
	р ^ = 1; BFS (1); р = рг; 
	BFS (р); ANS = дис [рг]; // BFS 
	
	Е ( "% d \ п", ANS); 
}

 

рекомендация

отwww.cnblogs.com/toot-wjh/p/11573183.html