Betrachten wir die einfacheren Versionen dieser Probleme, bei denen Kanten nicht gewichtet sind.
Überprüfen Sie anhand eines Graphen , ob G einen Zyklus hat.GG
Gegeben ein Graph und eine ZahlGÜberprüfen Sie anhand k , ob G einen Zyklus mit einer Länge von mindestens k hat .kGk
Der erste ist einfach und kann mit DFS gelöst werden. Der zweite ist NP-hart.
Schauen wir uns ein noch einfacheres Problem an:
Überprüfen Sie anhand eines Graphen und zweier Eckpunkte s und t , ob es einen einfachen Pfad von s gibtGsts in G nach .tG
Überprüfen Sie anhand eines Graphen und zweier Eckpunkte s und t sowie einer Zahl k , ob es einen einfachen Pfad von s nach t gibtGstkst in mit einer Länge von mindestens k gibt .Gk
Alle diese Probleme haben den gleichen Geschmack. Das obere ist einfach, während das untere NP-hart ist. Ich werde den Unterschied für das letzte erklären, weil es einfacher ist, aber die gleiche Erklärung gilt für die anderen Paare.
Der Grund, warum die oberen einfach sind, während die unteren nicht einfach sind, ist das Ergebnis der Struktur der Antworten auf diese Probleme.
Schauen wir uns zunächst das Problem an, einen einfachen Pfad zu finden, und versuchen wir, ihn rekursiv zu lösen. Wenn wir nur versuchen, dieses Problem direkt zu lösen, müssten wir die Eckpunkte verfolgen, die wir bisher verwendet haben:
es gibt einen Pfad von s nach tSimplePath(s,t,G):=st in . G
wenn f s = t oder für einige u ∈ G S i m p l e P a t h ( s , u , G - t ) und uSimplePath(s,t,G)
s=tu∈G SimplePath(s,u,G−t) .ut∈G
Wenn wir versuchen, das Problem mit diesem naiven rekursiven Algorithmus zu lösen, wird es exponentiell lange dauern: Es
gibt exponentiell viele Möglichkeiten für die Menge nicht verwendeter Eckpunkte!
Wir müssen schlauer sein.
Warum haben wir exponentiell viele Möglichkeiten bekommen? Da wir versucht haben, einen einfachen Pfad zu finden und diese Bedingung durchzusetzen, mussten wir nicht verwendete Scheitelpunkte verfolgen.
OK, also lassen Sie uns diese Bedingung fallen und sehen, wo wir sie bekommen können:
Betrachten Sie das Problem, einen Pfad (nicht unbedingt einfach) von nach t zu finden . Da der Pfad nicht einfach sein muss, müssen wir nicht verwendete Scheitelpunkte nicht verfolgen. Mit anderen Worten, das Diagramm ändert sich im Laufe der Zeit nicht.st
es gibt einen Weg von s nach t .PathG(s,t):=st
genau dannwenn s = t oder
für einige u ∈ G P a t h G ( s , t ) und u t ∈ G .PathG(s,t)
s=t
u∈G PathG(s,t)ut∈G
Aber wir sind noch nicht fertig. Das Problem ist, dass wir nicht wissen, ob
ein kleineres Problem ist als P a t h G ( s , t ) . Diese rekursive Lösung kann also in einer Schleife enden und niemals enden.PathG(s,u)PathG(s,t)
Um dies zu vermeiden, können wir einen zusätzlichen Parameter hinzufügen, der sicherstellt, dass das Problem kleiner wird: die Anzahl der Kanten im Pfad.
es gibt einen Weg von s nach t mit höchstens k Kanten.PathG(s,t,k):=stk
wenn k = 0 und s = t oder k > 0 und für einige u ∈ G P a t h G ( s , u , k - 1 ) und u t ∈ G.PathG(s,t,k)
k=0s=t
k>0u∈G PathG(s,u,k−1)ut∈G .
Beachten Sie nun, dass es einen einfachen Pfad von nach t gibt, wenn es einen Pfad von s nach t mit höchstens n gibtststn Kanten gibt. Mit anderen Worten:
wenn P a t h G ( s , t , n ) .SimplePath(s,t,G)PathG(s,t,n)
Die wesentlichen Punkte hier sind:
Jeder (nicht triviale) einfache Pfad von nach t
besteht aus einem einfachen Pfad von s zu einem Scheitelpunkt u und einer Kante u t .stsuut
Wir können annehmen, dass nicht im einfachen Pfad von s nach u erscheint .tsu
Wir müssen die Liste der nicht verwendeten Scheitelpunkte nicht explizit beibehalten.
Diese Eigenschaften ermöglichen es uns, eine intelligente Rekursion
für die Existenz eines einfachen Pfadproblems.
Diese gelten nun nicht für das Problem, einen Pfad mit einer Länge von mindestens . Wir wissen nicht, wie wir das Problem reduzieren können, einen einfachen Pfad mit einer Länge von mindestens k zu findenkk
zu finden, auf ein kleineres Teilproblem ohne die Liste der nicht verwendeten Eckpunkte beizubehalten. Diese Eigenschaften ermöglichen es uns, das Vorhandensein eines Pfadproblems effizient zu lösen.
Wenn ein Graph keinen negativen Zyklus hat, können wir die Existenz eines Pfades mit einer Länge von höchstens k lösenk Problemen und der kürzesten einfachen Pfadprobleme effizient lösen.
k3s,u,tw(su)=1000,w(st)=1000,w(ut)=10,w(tu)=101001stu1001sut . Daher können wir eine Instanz des Problems nicht auf eine kleinere Instanz des Problems reduzieren, ohne die Liste der nicht verwendeten Scheitelpunkte explizit anzugeben.
k Problemen, während wir eine intelligente Rekursion für die Existenz eines einfachen Pfades kennen.
Wenn Sie zum letzten Teil Ihrer Frage zurückkehren, gibt es ein Problem mit Ihrer Argumentation.
>k kkkO(nk) .)
kk