Ein gerichteter Graph G = (V, E) wird als semi-verbunden bezeichnet, wenn für alle Eckenpaare u, v in V u -> v oder v gilt -> Pfad. Geben Sie einen effizienten Algorithmus, um zu bestimmen, ob oder ob nicht G halb verbundenErmitteln, ob ein Graph semi-verbunden ist oder nicht
Antwort
Trivial O(V^3)
Lösung floyd warshal verwenden könnte all-to-all kürzesten Weg ist, aber das ist zuviel des Guten (in Bezug auf die Zeitkomplexität).
Es kann in O(V+E)
getan werden.
Claim:
A DAG halb in einer topologischen Sortierung verbunden ist, für jede i
, gibt es eine Kante (vi,vi+1)
Beweis:
a DAG mit topologische Sortierung Gegeben v1,v2,...,vn
:
Wenn keine Kante vorhanden ist (vi,vi+1)
für einige i
, dann gibt es auch keinen Pfad (vi+1,vi)
(weil es eine topologische Art einer DAG ist), und das Diagramm ist nicht halb verbunden.
wenn für jede i
eine Kante ist (vi,vi+1)
, dann für jeden i,j
(ivi- > vi + 1- > ...- > vj vj >-1- und der Graph halb verbunden.
daraus können wir den Algorithmus erhalten.
- Finden SVB Maximal in der Grafik
- den SCC graph Bauen G '= (U, E'), so dass
U
ein Satz von SVB istE'= {(V1,V2) | there is v1 in V1 and v2 in V2 such that (v1,v2) is in E)
- Do topologische Sortierung auf G '
- Überprüfen Sie, ob für jedes i, gibt es Kante Vi, Vi + 1.
Korrektheitsbeweis:
Wenn der Graph halb verbunden ist, für ein Paar (v1,v2)
, so dass es einen Weg v1->...->v2
ist - lassen Sie V1, V2 ihre SVB sein. Es gibt einen Pfad von V1 nach V2 und somit auch von v1 nach v2, da alle Knoten in V1 und V2 stark verbunden sind.
Wenn der Algorithmus wahr ergab, als für zwei gegebenen Knoten v1, v2 - sind in SCC V1 und V2. Es gibt einen Pfad von V1 nach V2 (ohne Verlust der Allgemeinheit) und somit auch von v1 nach v2.
Als Randbemerkung, auch jede halb zusammenhängenden Graphen haben eine Wurzel (Vertex r
, die alle Ecken führen):
Beweis:
Angenommen, es gibt keine Wurzel. Definieren Sie #(v) = |{u | there is a path from v to u}|
(Anzahl der Knoten mit einem Pfad von v
zu ihnen).
Wählen Sie a
so, dass #(a) = max{#(v) | for all v}
. a
ist kein Root, also gibt es einen Knoten u
, der keinen Pfad von a
zu ihm hat. Da der Graph halb verbunden ist, bedeutet dies, dass es einen Pfad gibt u->...->a
. Aber das bedeutet #(u) >= #(a) + 1
(alle Knoten erreichbar von a
und auch u
).
Widerspruch zur Maximierung von #(a)
, daher gibt es eine Wurzel.
Amit Soltuin beschrieben vollständig den effizientesten Ansatz. Ich könnte nur hinzufügen, dass man Schritt 4 ersetzen kann, indem man überprüft, ob es mehr als eine topologische Ordnung von G 'gibt. Wenn ja, dann ist der Graph nicht halb verbunden. Ansonsten ist das Diagramm halb verbunden. Dies kann leicht in Kahn's algorithm zum Auffinden der topologischen Ordnung eines Graphen eingebaut werden.
Eine andere weniger effiziente Lösung, die in quadratischer Zeit arbeitet, ist die folgende.
Konstruieren Sie zuerst einen anderen Graphen G *, der die Umkehrung des ursprünglichen Graphen ist. Dann führen Sie für jeden Vertex v von G ein DFS von v in G aus und betrachten die Gruppe erreichbarer Knoten als R_v. Wenn R_v! = V (G), dann führe ein anderes DFS von v in G * aus und lass die Menge erreichbarer Knoten R _v sein. Wenn die Vereinigung von R_v und R _v nicht V (G) ist, dann ist der Graph nicht halb verbunden.
- 1. Ermitteln, ob ein Fenster sichtbar ist oder nicht C#
- 2. Ermitteln, ob ein COM ein In-Proc oder LocalServer ist
- 3. Ermitteln, ob Clientgerät mobiile ist oder PC
- 4. Ermitteln, ob Postback page_load oder itemcommand ist
- 5. Ermitteln, ob ein Element ein Formularfeld ist
- 6. Ermitteln, ob Element ein Listenelement oder Dokument ist
- 7. Ermitteln, ob ein Websocket send() fertig ist
- 8. Ermitteln, ob $ .ajax Fehler ist ein Timeout
- 9. tmux Ermitteln, ob ein Fensterbereich markiert ist
- 10. Ermitteln, ob JavaScript e.keyCode ein druckbares (nicht kontrolliertes) Zeichen ist
- 11. Ermitteln, ob ein Verzeichnis beschreibbar ist
- 12. Ermitteln, ob ein Menü heruntergefallen ist
- 13. Ermitteln, ob ein Formular vollständig ausgeblendet ist
- 14. Ermitteln, ob Stream-Schnittmenge nicht leer ist
- 15. Ermitteln, ob Aktionsleiste geteilt ist
- 16. Ermitteln, ob WindowServer verfügbar ist?
- 17. Ermitteln, ob FILE * beschreibbar ist
- 18. Bestimmen Sie, ob ein ungerichteter Graph ein Baum ist
- 19. Ermitteln, ob begindate ist Wochenende
- 20. Boost Graph Library: Überprüfen, ob ein Diagramm gerichtet ist oder nicht
- 21. Facebook graph API: Überprüfen ob ein Benutzer online ist?
- 22. Ermitteln, ob Json Ergebnisse ist Objekt oder Array
- 23. Win32: Ermitteln, ob stdout handle char oder wchar Stream ist
- 24. Ermitteln, ob das iOS-Gerät 32- oder 64-Bit ist
- 25. Django: Ermitteln, ob das Kontrollkästchen abgeschickt oder deaktiviert ist
- 26. Ermitteln, ob ein Datum ein Samstag oder ein Sonntag ist mit JavaScript
- 27. Ermitteln, ob eine Pfadangabe ein Verzeichnis oder eine Datei (oder etwas anderes) über WMI ist?
- 28. Bestimmen, ob ein Graph K-Vertex-verbunden ist
- 29. Effizient ermitteln, ob ein Geschäft geöffnet ist oder nicht basierend auf Geschäftszeiten
- 30. Ermitteln, ob ein Typ ein anonymer Typ ist
Danke für die Antwort. – Piyush
Was ist, wenn der Graph zyklisch ist? in diesem Fall gibt es keine topologische Sortierung dafür, aber AFAICS könnte immer noch halb verbunden sein. –
@PeriataBreatta Wie die Antwort sagt, nehmen Sie zuerst die SCCs (stark verbundene Komponenten) Die Grafik der SCCs (wie in 2 beschrieben) ist garantiert eine DAG. – amit