Ganz ähnlich zu meiner zuvor geposteten Frage . Diesmal ist das Diagramm jedoch ungerichtet.
Gegeben
- Ein ungerichteter Graph ohne Mehrkanten oder Schleifen,
- Ein Quellscheitel ,
- Ein Zielscheitelpunkt ,
- Maximale Weglänge ,
Ich suche nach - Ein Teilgraph von , der einen beliebigen Scheitelpunkt und eine beliebige Kante in (und nur diejenigen), die Teil mindestens eines einfachen Pfades von nach mit der Länge .
Anmerkungen:
- Ich muss die Pfade nicht aufzählen.
- Ich suche einen effizienten Algorithmus (sowohl Zeit als auch Speicher), da ich ihn über sehr große Graphen ausführen muss (10 ^ 8 Eckpunkte, 10 ^ 9 Kanten).
ds.algorithms
graph-algorithms
shortest-path
Lior Kogan
quelle
quelle
Antworten:
Nun, das Problem ist immerhin in Ich werde die vorherige Antwort behalten , da sie auch für den gerichteten Fall (der NPC ist, wie bei der anderen Frage beantwortet) funktioniert und zeigt, dass es sich um F P T in Bezug auf l handelt .P FPT l
Im ungerichteten Fall ist es lösbar, deterministisch über den minimalen Kostenfluss (dies funktioniert möglicherweise nicht auf den Skalen, auf die Sie sich in der Frage beziehen, aber es ist besser als der exponentielle Algorithmus.
Die folgende Prozedur entscheidet, ob eine Kante ein Teil des Ausgabegraphen sein soll. Um das ursprüngliche Problem zu lösen, schleifen Sie einfach über alle Kanten.e=(u,v)∈E
Gehen Sie wie folgt vor, um das Flow-Netzwerk zu erstellen:
Schritt 1: Erweitern einen Scheitelpunkt zu haben , x e und ersetzen e mit den Kanten ( u , x e ) , ( x e , u ) , ( v , x e ) , ( x e , v ) (sie als einen gerichteten Teil des Verkehrsnetzes), setzen Sie ihre Kosten auf 0.e xe e (u,xe), (xe,u),(v,xe),(xe,v)
Schritt 2: Ersetzen Sie jeden Scheitelpunkt mit Ausnahme von x e durch zwei Scheitelpunkte t - und t + und fügen Sie eine Kante ( t - , t + ) hinzu . Setzen Sie die Kosten für diese Kanten auf 1.t xe t− t+ (t−,t+)
Schritt 3: Ersetzen Sie jede Kante durch die Kanten ( a + , b - ) , ( b + , a - ) . Setzen Sie die Kosten dieser Kanten auf 0.{a,b}∈E (a+,b−),(b+,a−)
Schritt 4: Fügen Sie einen neuen Eckpunkt und fügen Sie die Kanten ( s , y e ) , ( t , y e ) mit den Kosten 0 hinzu.ye (s,ye),(t,ye)
Schritt 5: Stellen Sie alle Kapazitäten auf 1 ein.
Führen Sie nun den Min-Cost-Flow-Algorithmus aus und suchen Sie nach einem Fluss von Wert 2 von nach y e .xe ye
Analyse:
quelle
Hier ist eine falsche Antwort: Es werden einige Eckpunkte ausgegeben, die Teil nicht einfacher Pfade von nach t sind und die nicht Teil eines einfachen Pfades von s nach t mit der Länge ≤ ℓ sind . Die Antwort ist möglicherweise immer noch relevant für die Bewerbung des Fragestellers. Deshalb lasse ich sie hier.s t s t ≤ℓ
Hier ist ein Algorithmus, der in der Zeit abläuft (und tatsächlich schneller ist als dies, wenn ℓ klein ist).O(|V|+|E|) ℓ
Der Algorithmus führt eine BFS-Suche von , die in der Tiefe ℓ endet . Dieses BFS gibt eine Menge V s aller Scheitelpunkte an, die von s mit einem Längenpfad von höchstens ℓ erreichbar sind , und berechnet auch die Abstände d i s t ( s , v ) für jedes v ∈ V s . Dann würde ich dasselbe von t machen und die Menge V t und die Entfernungen von t erhalten . Schließlich sind die Eckpunkte, nach denen Sie suchen, genau V s o l us ℓ Vs s ℓ dist(s,v) v∈Vs t Vt t . Die Kanten sind genau diejenigen Kanten inE[ V s o l u t i o n ](=(v,u)Vsolution={v:v∈Vs∩Vt,dist(s,v)+dist(t,v)≤ℓ} E[Vsolution] ).=(v,u)∈E:u,v∈Vsolution
Die Laufzeit dieses Algorithmus ist sicherlich weil er nur zwei BFSs ausführt. Die Laufzeit ist jedoch tatsächlich O ( | V s | + | V t | + | E [ V s ] | + | E [ V t ] | ), was viel kleiner ist als die Größe des Graphen, wenn der ℓ- Radius Nachbarschaften von s und tO(|V|+|E|) O(|Vs|+|Vt|+|E[Vs]|+|E[Vt]|) ℓ s t sind klein.
Edit: In der Praxis gibt es wahrscheinlich einen etwas schnelleren Algorithmus, der ein BFS aus und t der Tiefe nur ℓ / 2 anstatt ℓ ausführt . Dadurch werden alle Pfade entdeckt, und mit ein wenig Buchhaltung können Sie alle Scheitelpunkte finden. Dies verkürzt die Laufzeit durch eine Quadratwurzel für den Fall eines großen Zufall aussehenden Graphen , wenn l klein ist.s t ℓ/2 ℓ ℓ
quelle
Dies ist als Kommentar gedacht, aber es ist zu lang, um einen Kommentar zu verfassen.
Möglicherweise interessieren Sie sich auch für Diagrammschlüssel oder Emulatoren für Ihre Zwecke. Ein Schraubenschlüssel eines Graphen ist ein Teilgraph H = ( V , E ' ) mit wenigen Kanten, aber ungefähr erhaltenen Abständen. Ein Emulator ist ein Graph H = ( V , E ' , w ), dessen Kanten gewichtet werden dürfen.G=(V,E) H=(V,E′) H=(V,E′,w)
Wenn das nützlich klingt, kann ich versuchen, die relevanten Konstruktionen für Sie zu graben.
quelle