web-dev-qa-db-ja.com

単純なサイクルを見つけるアルゴリズムとは何ですか?

オイラー周期ハミルトニアン周期 がないグラフがあります。このグラフを単純なサイクルに分割したいと思います。
エッジは単純なサイクルで繰り返すことはできません。

これはどのように行うことができますか?

6
user1027854

オイラー周期に従ってください。以前に行った頂点に到着するときはいつでも、2つの訪問の間の部分は単純なサイクルです。それを切り取って、単純なサイクルのリストに格納し、現在使用しているものを除いて、その中で使用されているすべての頂点を未訪問としてマークします。すべてのエッジが使用されるまで続行します。

オイラー周期を見つけるには Hierholzerの方法 が効率的です。

1
Daniel Fischer

オイラー周期がわからない場合は、 Hierholzerのアルゴリズム を使用します。

(EC内に含まれるものだけでなく、ネットワーク内のevery単純なサイクルを見つける方法を示すために編集されました。これは質問者が望んだものですか?)

オイラーサイクルを既に知っていると仮定して、オイラーサイクルをたどるだけです。すでにアクセスしたノードにアクセスするたびに、cycleが見つかりました。このサイクル内に他の繰り返しがないことを確認して、それが単純なサイクルであることを確認する必要があります。例えば

A -> B -> C -> D -> B -> E -> A

A ... Aはサイクルであり、B -> Bはサイクルですが、後者のみが単純なサイクルです

また、2つの単純なサイクルで、多くのノードとエッジを互いに共有できます。例えば、

A -> X -> B -> Y -> A -> Z -> B

A ... AおよびB ... Bは、ノードとエッジを互いに共有する単純なサイクルです。

=グラフ内の検索every単純なサイクル=

すべての単純なサイクルは、オイラーサイクル(EC)に含まれるか、EC全体に分散されます。私が「広げる」という意味の例として、このEC内に単純なサイクルA -> B -> C -> Aを見ることができます。

D -> A ==> B -> E -> F -> B ==> C ==> A -> D

一部のエッジを長くして強調表示しました。これらのエッジは単純なサイクルの一部を形成します。したがって、ECとevery単純なサイクルを見つけるという目標が与えられた場合、ECのエッジのすべてのサブセットを列挙することが問題になります。

しかし、簡単な観察でかなりスピードアップできます。 候補シンプルサイクルA->Bを含めることを決定した場合、含めることを決定する次のエッジはBで開始する必要があり、その後、次のエッジ。これにより、検索ツリーの多くの大きな部分を無視しやすくなります。

実際、このアルゴリズムはすべての単純なサイクルを見つけるのにかなり最適な効率だと思います。何かご意見は?

0
Aaron McDaid