Bestimmen, ob ein graph ist semi-verbunden oder nicht
Gerichteter graph G = (V, E) ist, sagte, semi-verbunden, wenn für alle Paare von Eckpunkten u, v in V haben wir u -> v oder v-> u-Pfad.
Geben Sie einen effizienten Algorithmus, um zu bestimmen, ob oder nicht G ist semi-verbunden
Du musst angemeldet sein, um einen Kommentar abzugeben.
Trivial
O(V^3)
Lösung könnte sein, die Nutzung floyd warshal all-to-all kürzeste Weg, aber das ist übertrieben (in Bezug auf die Zeit-Komplexität).Kann man das in
O(V+E)
.Anspruch:
Einer DAG ist halb verbunden in einer topologischen Sortierung für jede
i
es gibt eine Kante(vi,vi+1)
Beweis:
Gegeben ein DAG mit der topologischen Sortierung
v1,v2,...,vn
:Wenn es keine Kante
(vi,vi+1)
für einigei
, dann gibt es auch keinen Weg(vi+1,vi)
(weil es eine topologische Sortierung eines DAG), und der graph ist nicht semi verbunden.Wenn man für jeden
i
gibt eine Kante(vi,vi+1)
, dann für jedei,j
(i < j) es gibt einen Pfadvi->vi+1->...->vj-1->vj
, und der graph ist halb verbunden.Aus diesem können wir den Algorithmus:
U
ist ein Satz von SCCs.E'= {(V1,V2) | there is v1 in V1 and v2 in V2 such that (v1,v2) is in E)
Korrektheit Beweis:
Wenn der graph ist halb verbunden, für ein paar
(v1,v2)
, so dass es einen Pfadv1->...->v2
- Let V1, V2 werden Ihre SCCs. Es gibt einen Pfad von V1 nach V2, und damit auch von v1 auf v2, da alle Knoten in V1 und V2 fest verbunden sind.Wenn der Algorithmus ergab true", dann für jeden zwei beliebigen Knoten v1, v2 - wir wissen, Sie sind in der SCC-V1 und V2. Es gibt einen Pfad von V1 nach V2 (ohne Verlust der Allgemeinheit), und damit auch von v1 nach v2.
Als seitliche Anmerkung, die auch alle semi-connected-graph besitzt eine Wurzel (vertex
r
führt, dass alle vertices):Beweis:
Angenommen, es gibt keine Wurzel. Definieren
#(v) = |{u | there is a path from v to u}|
(Anzahl der Knoten, die einen Pfad vonv
zu Ihnen).Wählen Sie
a
so dass#(a) = max{#(v) | for all v}
.a
ist nicht eine Wurzel, so gibt es einige Knotenu
hat, dass kein Pfad vona
zu. Da der graph ist halb verbunden, es bedeutet, dass es einen Pfadu->...->a
. Aber das bedeutet, dass#(u) >= #(a) + 1
(alle Knoten aus erreichbara
und auchu
).Widerspruch zu maximality von
#(a)
, so gibt es eine Wurzel.Amit ist soltuin vollständig beschrieben der effizienteste Ansatz. Ich könnte nur hinzufügen, dass kann man ersetzen Schritt 4 überprüfen, ob es mehr als eine topologische Ordnung von G'. Wenn ja, dann ist der graph ist nicht semi verbunden. Ansonsten, die Grafik ist halb verbunden. Dies kann leicht integriert in Kahn ' s Algorithmus für die Suche nach topologische Ordnung eines Graphen.
Anderen weniger effiziente Lösung, die funktioniert in quadratischer Zeit ist die folgende.
Erste, den Bau eines weiteren Graphen G* das ist die Umkehrung des ursprünglichen Graphen. Dann für jeden Knoten v von G Sie führen ein DFS von v in G und betrachten die Menge der erreichbaren Knoten als R_v. Wenn R_v != V(G), dann laufen weitere DFS von v in G* und lassen Sie das setzen von erreichbaren Knoten R "_v". Wenn die union von R_v und R " _v " ist nicht V(G) dann ist der graph ist nicht semi verbunden.