有向グラフでは、グラフの各頂点を1回だけ訪れるアルゴリズムとは何ですか?これはハミルトニアンサイクルとは異なります。つまり、同じ頂点でパスを開始および終了する必要はありません。有向グラフのすべての頂点を1回だけ訪れるパスを見つける。
頭に浮かぶバックトラッキングアルゴリズム 1つのアルゴリズム、バックトラックされたが、すべてのステップで、あなたはすべての可能な接続/パスを探索し、ブール訪問した配列を維持し、何の頂点が訪問されていないことを確認するために、再帰を使用して実装一回以上。バックトラックをバックワードすると、このブール値はfalseに設定されます(バックトラッキングの必須ステップ)。基本ケースは、訪問された頂点の数を比較し、それがグラフのノードの数と一致することを確認します。その場合、trueを返します。別の基本的な場合は、すべての頂点が訪問されていない場合でも偽を返すことですが、再帰を続けるための他の接続は存在しません。
しかし、これの時間の複雑さは望ましくないO(n!)
です。
有向グラフのパス/トラバーサルを見つけるためのより良いアルゴリズムがあります。これは、グラフの各頂点を一度正確にカバーします。
強く接続されたコンポーネント(https://en.wikipedia.org/wiki/Strongly_connected_component)を見てもわかりません。グラフが凝縮すると、ランタイムが短縮されることがあります。しかし、私の気持ちは、あなたが最悪の場合、O(n!)よりも良くならないということです。 – Henry
この問題を解決するための効率的なアルゴリズムがあれば、効率的にハミルトニアンサイクルを解くこともできます(「効率的に」とは「多項式時間」を意味します):ハミルトニアンサイクルの任意のインスタンスに対して、ハミルトニアンパス問題単一の頂点。効率的なアルゴリズムをn回(インスタンスごとに1回)使用して、それぞれのHPが存在する場合はそれを探します。これらのn個のグラフのいずれかにHPがあり、そのグラフで削除された特定の頂点を追加することでHCに変換できれば、HCを見つけたことになります。そうでなければ、どんなHCでもかまいません。 –
@Henry、私は強く接続されたコンポーネントは、コンポーネントのすべての頂点が同じコンポーネントの別の頂点から到達可能であることを理解しています。これにはTarjanのような効率的なアルゴリズムがありますが、私の問題は少し異なります。私はすべての頂点に到達することを望んでいます。あなたはまだnより良い解決策があると思いますか?これを解決するために? – saltmangotree