Rozważ skierowane wykresy. Nazywamy węzeł supergwiazdą wtedy i tylko wtedy, gdy nie można do niego dotrzeć z żadnego innego węzła, ale wszystkie inne węzły mają krawędź do . Formalnie:v
v
z liczba węzłów na wykresie. Na przykład na poniższym wykresie niewypełniony węzeł jest supergwiazdą (a inne węzły nie są).
[ źródło ]
Jak możesz zidentyfikować wszystkie gwiazdy na kierowanych wykresach w czasie ? Odpowiednią reprezentację grafu można wybrać spośród zwykłych kandydatów ; powstrzymaj się od używania reprezentacji, które przenoszą złożoność problemu na proces wstępnego przetwarzania.
Nie można przyjąć żadnych założeń dotyczących gęstości. Nie zakładamy, że wykres zawiera gwiazdę; jeśli nie ma, algorytm powinien go rozpoznać.
Notacja : to liczba krawędzi wychodzących w węźle, podobny dla krawędzi przychodzących.
źródło
Odpowiedzi:
Możemy wyeliminować wszystkie z wyjątkiem jednego z wierzchołków, sprawdzając obecność krawędzi ponieważ możemy wyeliminować jedną możliwość dla każdej sprawdzanej krawędzi. W szczególności, jeśli krawędź biegnie od do , eliminujemy i przechodzimy do (ponieważ można z niej dotrzeć do innego wierzchołka); jeśli nie, eliminujemy (ponieważ nie można do niego dotrzeć z ). Kiedy dotrzemy do ostatniego wierzchołka, którykolwiek wierzchołek nie zostanie wyeliminowany, należy go porównać ze sobą (upewnij się, że warunek supergwiazdy jest zachowany: istnieje krawędź przychodząca, ale nie wychodząca), dopóki nie zostanie wyeliminowana lub potwierdzona jako supergwiazda. Niektóre pseudokod:n−1 x y x y y x
Przejdźmy przez przykład, aby zilustrować tę metodę. Weź tę tablicę z wierzchołkiem źródłowym u góry i miejscem docelowym z boku. 1 oznacza krawędź:
Wyszarzę wierzchołki, które wykluczyliśmy jako potencjalne gwiazdy. Użyję zielonego i czerwonego, aby wskazać krawędzie, na które patrzymy, kiedy to robią i nie zawierają krawędzi, której szukamy, i niebieskiej, aby wskazać, gdzie już patrzyliśmy.
Zaczynamy od spojrzenia na wierzchołki 1 i 2.
Widzimy, że nie ma takiej krawędzi, więc eliminujemy 1 i bierzemy 3 jako nasz aktualny wierzchołek. Przypomnijmy, że już wyeliminowaliśmy 2, więc sprawdź, czy jest krawędź od 4 do 3:
Istnieje krawędź od 4 do 3, więc eliminujemy 4. W tym momencie wyeliminowaliśmy wszystkie z wyjątkiem jednego z wierzchołków (3), więc sprawdź jego krawędzie i sprawdź, czy się kwalifikuje:
Istnieje przewaga od 1 do 3, ale nie odwrotnie, więc 3 nadal jest kandydatem.
Istnieje również przewaga od 2 do 3, ale nie odwrotnie, więc 3 wciąż jest kandydatem.
Istnieje krawędź od 4 do 3, ale nie od 3 do 4; która kończy naszą kontrolę krawędzi 3 i odkryliśmy, że jest to supergwiazda.
Ponieważ eliminujemy jeden wierzchołek jako możliwą supergwiazdę na każdej z pierwszych kontroli krawędzi , najlepszym przypadkiem jest to, że ta kontrola eliminuje końcowy wierzchołek dla złożoności . W najgorszym przypadku (ostatni lub przedostatni wierzchołek jest supergwiazdą lub ostateczna kontrola go dyskwalifikuje), po pierwszych porównaniach porównujemy kandydata z więcej wierzchołków, dla najgorszy przypadek złożoności ( ). Ten algorytm to .n−1 n n n−1 2×(n−1) 3n−3 O(n) Θ(n)
źródło
Czy to nie problem z celebrytą ?
Będzie tylko jedna supergwiazda (gwiazda), jeśli taka istnieje.
Używamy reprezentacji macierzy przyległości, gdzie jeśli istnieje skierowana krawędź od do , w przeciwnym razie jest to . (Zgaduję, że jest to dozwolone).i j 0A[i,j]=1 i j 0
Patrząc na (można to zrobić za czas), możemy wyeliminować co najmniej jednego z nich jako kandydata na celebrytę: Jeśli , następnie można wyeliminować . Jeśli , możemy wyeliminować .O ( 1 ) A [ i , j ] = 1 i A [ i , j ] = 0 jA[i,j] O(1) A[i,j]=1 i A[i,j]=0 j
Utrzymuj listę aktualnych kandydatów, eliminując jeden po drugim. Połączona lista powinna wystarczyć.
Na koniec możesz sprawdzić, czy twój kandydat jest rzeczywiście gwiazdą.
Algorytmem będzie .O(n)
źródło
Ta odpowiedź dotyczy wersji pytania, w której możliwa była dowolna reprezentacja graficzna, a nie bieżącej wersji pytania.
Przechowuj wykres jako parę listy sąsiedztwa i odwróconej listy sąsiedztwa, gdzie każda lista zawiera dodatkowo długość listy, a zatem odpowiednio liczbę na zewnątrz i na krawędzi.
Przetwarzanie wstępne: oblicz listę odwrotnego przylegania (to znaczy listę krawędzi wewnętrznych). Koszt .O(|E|)
Przejdź przez listy i wybierz dowolny węzeł, w którym liczba krawędzi zewnętrznych wynosi a liczba krawędzi wewnętrznych wynosi . Koszt .n - 1 O ( | N | )0 n−1 O(|N|)
źródło
Dla odniesienia jest to pseudokod rekurencyjnej wersji tego, co opublikował Kevin.
źródło