Определение:
Учитывая, дерево, дерево имеет вес каждого ребра, на расстояние, определенное между двумя дерева справа от пути, соединяющей две точки и ребра. Диаметр дерева называется расстояние между самыми дальними двумя узлами в дереве, путь, соединяющий две точки, называется самой длинной цепью дерева. Последний также может упоминаться как правило, в диаметре, то есть значение диаметра представляет собой концепцию, путь может быть от имени, что
Есть, как правило, два диаметра дерева метод для нахождения, по времени сложность О (п). Мы предполагаем, форму направленного дерева графа задается 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); }