Graf skierowany G = (V, E) ma być częściowo połączony, jeśli dla wszystkich par wierzchołków u, v w V mamy u -> v lub v -> Ścieżka. Podaj skuteczny algorytm do ustalenia, czy pół-G jest podłączonyUstal, czy wykres jest częściowo połączony czy nie
Odpowiedz
Trivial O(V^3)
rozwiązaniem mogłoby być wykorzystanie floyd warshal wszystkim do wszystkich najkrótsza droga, ale to overkill (pod względem czasu złożoności).
Można to zrobić w O(V+E)
.
Zastrzeżenie:
DAG jest częściowo połączony topologicznej rodzaju dla każdego i
nie istnieje krawędź (vi,vi+1)
Dowód:
względu DAG z topologicznej sortowania v1,v2,...,vn
:
Jeśli nie ma krawędzi (vi,vi+1)
dla niektóre i
, to nie ma też ścieżki (vi+1,vi)
(ponieważ jest to topologiczny rodzaj DAG), a wykres nie jest częściowo połączony.
Jeżeli dla każdej i
istnieje krawędź (vi,vi+1)
, to dla każdej i,j
(ivi- > VI + 1 > ...- > vj-1- > vj, a wykres jest częściowo połączone.
z tego możemy uzyskać algorytm.
- Znajdź Maksymalne SCC na wykresie
- Budowanie SCC graf G „= (U, E”) w taki sposób,
U
jest zbiorem SCCE'= {(V1,V2) | there is v1 in V1 and v2 in V2 such that (v1,v2) is in E)
- Czy sortowanie topologiczne na G '
- Sprawdź, czy dla każdego i istnieje krawędź Vi, Vi + 1.
Poprawność Dowód:
Jeżeli wykres jest pół podłączone do pary (v1,v2)
, tak że istnieje ścieżka v1->...->v2
- Niech V1, V2 być ich SCC. Istnieje ścieżka od V1 do V2, a więc również od v1 do v2, ponieważ wszystkie węzły w V1 i V2 są silnie połączone.
Jeśli algorytm ustąpił prawdy, to dla dwóch podanych węzłów v1, v2 - są w SCC V1 i V2. Istnieje ścieżka od V1 do V2 (bez utraty ogólności), a więc również od v1 do v2.
marginesie również co pół połączony wykres ma pierwiastek (Vertex r
który prowadzi do wszystkich wierzchołków)
Dowód:
Zakłada się, że nie jest głównym. Zdefiniuj #(v) = |{u | there is a path from v to u}|
(liczba węzłów, które mają ścieżkę od v
do nich).
Wybierz a
taki, że #(a) = max{#(v) | for all v}
. a
nie jest katalogiem głównym, więc istnieje jakiś węzeł u
, który nie ma ścieżki od a
do niego. Ponieważ wykres jest częściowo połączony, oznacza to, że istnieje ścieżka u->...->a
. Ale to oznacza #(u) >= #(a) + 1
(wszystkie węzły są dostępne od a
, a także u
).
Sprzeczność z maksymą #(a)
, a więc istnieje root.
Solitain Amita opisał całkowicie najbardziej efektywne podejście. Mogę tylko dodać, że można zastąpić krok 4, sprawdzając, czy istnieje więcej niż jedna kolejność topologiczna G '. Jeśli tak, to wykres nie jest częściowo połączony. W przeciwnym razie wykres jest częściowo połączony. Można to łatwo włączyć do Kahn's algorithm w celu znalezienia kolejności topologicznej wykresu.
Kolejne mniej wydajne rozwiązanie działające w systemie kwadratowym jest następujące.
Najpierw skonstruuj inny wykres G *, który jest odwrotnością oryginalnego wykresu. Następnie dla każdego wierzchołka v G, uruchamiasz DFS z vw G i traktujesz zestaw osiągalnych węzłów jako R_v. Jeśli R_v! = V (G), uruchom inny DFS z v w G * i niech zbiór dostępnych węzłów to R _v. Jeśli związek R_v i R _v nie jest V (G), wówczas wykres nie jest częściowo połączony.
- 1. Ustal, czy typ jest statyczny.
- 2. Ustal, czy pole wyboru dostępu jest sprawdzane, czy nie
- 3. Ustal, czy pasek akcji jest podzielony
- 4. Ustal, czy karta przeglądarki jest aktywna? - IE?
- 5. Ustal, czy widok jest na ekranie - Android
- 6. Ustal, czy ciąg znaków jest "pusty".
- 7. Ustal, czy obiekt jest liczbą całkowitą
- 8. Ustal, czy data Oracle jest weekendem?
- 9. Ustal, czy znak jest liczbą lub literą
- 10. Ustal, czy podgląd jest widoczny w UIScrollView
- 11. Ustal, czy data jest sobotą czy niedzielą przy użyciu JavaScriptu
- 12. Ustal, czy urządzenie ma ekran dotykowy czy nie.
- 13. Czy można częściowo zwolnić pamięć?
- 14. Clojure: ustal, czy istnieje funkcja
- 15. Ustal, czy nastąpiła zmiana dzienna
- 16. Jak wykryć, czy ukierunkowany wykres jest cykliczny?
- 17. Jak sprawdzić, czy skierowany wykres jest acykliczny?
- 18. Graphviz: łamać płaski, ale słabo połączony wykres na wiele wierszy?
- 19. Ustal, czy biblioteka C jest zainstalowana na systemie Unix
- 20. Ustal, czy MailItem jest otwarty w trybie redagowania lub przeczytane
- 21. Ustal, czy rekord "jest nowy" w wywołaniu zwrotnym przed zapisaniem
- 22. C# Ustal, czy obiekt jest obecny na obrazku:
- 23. Ustal, czy adres URL jest bezwzględny lub względny od vb
- 24. Ustal, czy JavaScript e.keyCode jest znakiem możliwym do wydrukowania (niekontrolowanym).
- 25. Ustal, czy przesłany plik jest obraz (dowolny format) na MVC
- 26. Ustal, czy skrypt jest uruchomiony w notatniku RStudio
- 27. Ustal, czy Alpha kanał jest używany w obrazie
- 28. Czy mogę buforować częściowo wykonane kwerendy LINQ?
- 29. Ustal, czy DataTables jest wykonane w wersji 1.10. Czy jest połączenie zwrotne?
- 30. Ustal, czy mapa zawiera wartość klucza?
Dzięki za odpowiedź. – Piyush
co jeśli wykres jest cykliczny? w takim przypadku nie ma dla niego rodzaju topologicznego, ale AFAICS może nadal być częściowo połączony. –
@PeriataBreatta Zgodnie z odpowiedzią, najpierw bierzesz SCC (Silnie połączone komponenty) Wykres SCC (jak opisano w 2) jest gwarantowany jako DAG. – amit