web-dev-qa-db-ja.com

DAGでハミルトンパスを見つけるアルゴリズム

私は、Skienna's Book on Algorithmsを参照しています。

グラフGに_Hamiltonian path_が含まれているかどうかをテストする際の問題は_NP-hard_です。ここで、ハミルトニアンパスPは、各頂点に1回だけアクセスするパスです。ハミルトニアンサイクル問題とは異なり、Pの終了頂点から開始頂点までGにエッジが存在する必要はありません。

有向非循環グラフG(DAG)が与えられた場合、ハミルトニアンパスが含まれているかどうかをテストするO(n + m)時間アルゴリズムを提供します。

私のアプローチ、

DFSと_Topological sorting_を使用する予定です。しかし、私は問題を解決する上で2つの概念をどのように結び付けるかを知りませんでした。トポロジーソートを使用してソリューションを決定する方法。

助言がありますか?

27
user2302617

最初にO(n + m)でDAGをトポロジ的に並べ替えることができます(すべてのDAGをトポロジ的に並べ替えることができます)。

これが完了すると、エッジが低いインデックスの頂点から高いインデックスに移動することがわかります。これは、連続する頂点間にエッジがある場合にのみハミルトニアンパスが存在することを意味します。

(1,2), (2,3), ..., (n-1,n).

(これは、ハミルトニアンパスでは「戻る」ことができず、まだすべてにアクセスする必要があるためです。したがって、唯一の方法は、「スキップしない」ことです。)

この状態はO(n)で確認できます。

したがって、全体的な複雑さはO(m + n)です。

44
Petar Ivanov

@agassaaの発言は完全に正しいとは思いません。 3つのノード「A」、「B」、「C」、およびエッジA-> B、B-> C、A-> Cがある単純な例を考えます。 Aには2つの子があり、Cには2つの親がありますが、A-> B-> Cはハミルトニアンパスを形成します。パスがハミルトニアンになるために、グラフのすべてのエッジをトラバースする必要はありません。

ハミルトニアンサイクルを持つDAG

1
kakadong