2017-06-11 20 views
0

有向グラフでは、グラフの各頂点を1回だけ訪れるアルゴリズムとは何ですか?これはハミルトニアンサイクルとは異なります。つまり、同じ頂点でパスを開始および終了する必要はありません。有向グラフのすべての頂点を1回だけ訪れるパスを見つける。

頭に浮かぶバックトラッキングアルゴリズム 1つのアルゴリズム、バックトラックされたが、すべてのステップで、あなたはすべての可能な接続/パスを探索し、ブール訪問した配列を維持し、何の頂点が訪問されていないことを確認するために、再帰を使用して実装一回以上。バックトラックをバックワードすると、このブール値はfalseに設定されます(バックトラッキングの必須ステップ)。基本ケースは、訪問された頂点の数を比較し、それがグラフのノードの数と一致することを確認します。その場合、trueを返します。別の基本的な場合は、すべての頂点が訪問されていない場合でも偽を返すことですが、再帰を続けるための他の接続は存在しません。

しかし、これの時間の複雑さは望ましくないO(n!)です。

有向グラフのパス/トラバーサルを見つけるためのより良いアルゴリズムがあります。これは、グラフの各頂点を一度正確にカバーします。

+0

強く接続されたコンポーネント(https://en.wikipedia.org/wiki/Strongly_connected_component)を見てもわかりません。グラフが凝縮すると、ランタイムが短縮されることがあります。しかし、私の気持ちは、あなたが最悪の場合、O(n!)よりも良くならないということです。 – Henry

+0

この問題を解決するための効率的なアルゴリズムがあれば、効率的にハミルトニアンサイクルを解くこともできます(「効率的に」とは「多項式時間」を意味します):ハミルトニアンサイクルの任意のインスタンスに対して、ハミルトニアンパス問題単一の頂点。効率的なアルゴリズムをn回(インスタンスごとに1回)使用して、それぞれのHPが存在する場合はそれを探します。これらのn個のグラフのいずれかにHPがあり、そのグラフで削除された特定の頂点を追加することでHCに変換できれば、HCを見つけたことになります。そうでなければ、どんなHCでもかまいません。 –

+0

@Henry、私は強く接続されたコンポーネントは、コンポーネントのすべての頂点が同じコンポーネントの別の頂点から到達可能であることを理解しています。これにはTarjanのような効率的なアルゴリズムがありますが、私の問題は少し異なります。私はすべての頂点に到達することを望んでいます。あなたはまだnより良い解決策があると思いますか?これを解決するために? – saltmangotree

答えて

2

ブックアルゴリズムの紹介この問題はNP完全です。この問題の多項式アルゴリズムはありませんが、存在しないことは証明されていません。したがって、最悪の場合、指数関数的な複雑さがあります。

注意事項 グラフに1つのリーフがある場合、このリーフはパスの開始または終了です。グラフに2つの葉がある場合、パスは一方のパスで開始し、もう一方のパスで終了する必要があります。 グラフに3つ以上のリーフがある場合、ハミルトニアンパスは存在しません。しかし一般的なグラフでは、素早いアルゴリズムはありません。

+0

それに感謝します。あなたが「最悪の場合、指数関数的な複雑さを得る」と言うとき、あなたはnを意味しますか?または、より良いアルゴリズムであるx^yがあります。これはnよりも優れています! – saltmangotree

+0

申し訳ありませんが、私はそれを指定していません。私はnを意味する! –

関連する問題