# AISD 3 ## Zadanie 3 1. znajdujemy centroid (*) (w przypadku gdy istnieją dwa możemy wybrać dowolny - asymptotycznie nie ma to wpływu na złożoność algorytmu) 2. Ukorzeniamy drzewo w centroidzie 3. W poddrzewach znajdujemy odległości wszystkich wierzchołków od centroidu określonego powyżej - dla każdego poddrzewa z osobna sortujemy odległości i zwracamy I) znajdujemy listę odległości II) ilość par wierzchołków takich że suma ich odległości do korzenia jest równa C (to sa zle przypadki - "dwa pointery") 4. Łączymy listy (z zachowaniem porządku - po prostu sortujemy po zwykłym merge'u) 5. "dwa pointery" (*) znajdowanie centroidów -> preprocessing - wyznaczenie rozmiaru poddrzewa dla każdego wierzchołka (DFS O(N)) wchodzimy do korzenia: -> sprawdzamy czy korzeń nie jest centroidem -> jeśli tak -> zwracamy go -> jeśli nie -> wchodzimy do "największego" syna - zwracamy jego wynik ( ** ) sprawdzenie czy wierzchołek jest centroidem -> dla każdego dziecka: -> jeśli jego rozmiar jest większy niż $\lceil{n/2}\rceil$ -> nie jest -> jeśli (n-1) - suma dzieci jest większa niż $\lceil{n/2}\rceil$ -> nie jest -> wpp jest