UPDATE: Die Antwort unten ist nicht korrekt, weil ich fälschlicherweise angenommen habe, dass der Hamilton-Pfad in einem beliebigen Graphen liegt, nicht in . Ich lasse es unberührt, vielleicht kann ich es reparieren oder es gibt einige Hinweise für eine andere Antwort.Kn
Ich denke es ist NP-komplett. Dies ist eine sehr informelle / schnelle Reduzierungsidee von 3SAT
Für jede Variable füge ich ein "variables Gadget" hinzu mit:xi
- drei Knoten Xi,+Xi,−Xi
- zwei variable Kanten und ( X i , - X i )(Xi,+Xi)(Xi,−Xi)
Fügen Sie einen Quellknoten und verbinden Sie ihn mit allen Variablen X i .SXi
Fügen Sie für jede Klausel einen Knoten C j hinzu und verbinden Sie ihn mit den entsprechenden Variablen + X i oder - X i , die die Klausel bilden.CjCj+Xi−Xi
(+x1∨−x2∨−x3)∧(−x2∨x3∨x4)
R(S,C1),(S,C2),...
P(Xi,+Xi)(Xi,−Xi) (in the picture above the blue edges represent the edges that we include in P).
At this point, the initial formula is satisfiable if and only if the shortest path from S to each clause node Cj is not greater than three. Indeed to reach a clause from S in three steps we must traverse at least one variable Xi: S→Xi→±Xi→Cj. So we must traverse one of the two edges: Xi→+Xi or Xi→−Xi) and include it into C (because by construction it's not part of P). But both cannot be included, because they share a vertex.
But we're not sure that we can build a simple path P that includes all the blue edges because some nodes have more than one incident blue edge.
To fix this we replace each node with multiple incident blue edges, with a tree that contains only pairs of incident blue edges that will be included in P and edges that separate them and that should be included in C to reach the clause nodes:
The original graph becomes:
Each tree should have the same depth (we just can pick the max of the depth required for all the clauses/variables/S); and we must increase the value of K accordingly (the number of steps to reach Cj from S).
We can include in C all the needed (not blue) edges required to reach the clause nodes because they share no vertex.
Furthermore with this construction we are able to build a simple path P that traverse each vertex and each blue edge, just add extra nodes to avoid shortcuts between the clauses or variables: