{0,1}重量のエッジを持つグラフ内の奇数合計重量のサイクルを検出する

cs.stackexchange https://cs.stackexchange.com/questions/126188

  •  29-09-2020
  •  | 
  •  

質問

エッジ加重Digraph $ g=(v、e \ subseteq v ^ 2、e \ \ {0,1 \})$ は、 $ Oよりも速く実行されるこのグラフに周期がある場合は、TRUEを返すアルゴリズムがあります。 |)(c + 1))$ $ c $ は、もちろん $ \ omomega(2 ^ {| v |})$ )?

質問が意味するように、私は $ o((| v | + | e | c + 1))$ 時間。このアルゴリズムは、最初に実行されています。 a>、これはグラフ内のすべての単純なサイクルを与えます。 FALSE以降、すべてのサイクルは簡単なサイクルを組み合わせて加算することによって行われます。グラフには奇数長の奇数サイクルが含まれている奇数の長さのサイクルが含まれています。したがって、単純サイクルのパリティを計算し、それらのいずれかが奇数である場合はeven + even = evenを返し、それ以外の場合はTRUEを返します。

誰もがより効率的なアプローチを思いつくことができますか?理想的には、私が実際に扱っているグラフがそれほど大きくないので、その結果として恒常的な要因が成功しているため、「ジョンソンのアルゴリズムをもう少し優れた簡単なサイクル列挙アルゴリズム」だけではありません。 / P>

役に立ちましたか?

解決

$ o(| v | \ cdot | e |)$ 時間。

フォームの頂点を $ \ langle v、b \ langle $ の頂点を持つDigraphを構築します。ここで、 $ v \ in v次のように、$ $ b \ in \ {0,1 \} $ $ v \ stackrel {t} {\ to} {\ to} w $ あなたのグラフの $ \ langle v、b \ rangle \ to \ langle w、b + tを追加します。 \ bmod 2 \ rangle $ $ b \ in \ {0,1 \} $ の新しいグラフへの$ 。

次に、 $ v \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ v \ x の場合は、 $ \ langle vからのパスがあるか確認してください。 0 \ rangle $ $ \ langle v、1 \ rangle $ 、または $ \ langle v、1 \ rangle $ $ \ langle v、この新しいグラフの0 \ rangle $ 。これは、vertex $ v \ inv $ ごとに2つのDFS検索で行うことができます。各DFS検索は $ o(| | e |)$ 時間ですので、常時走行時間は $ o(| V | \ CDOT | e |)$ 時間。新しいグラフを強く接続されたコンポーネントに一度に分解してから、コンポーネントのDAG(メタグラフ)を検索することで検索をスピードすることができます。

他のヒント

エッジ頂点入射行列を構築する:行はエッジ、頂点への列に対応し、エッジが頂点に入ると $ 1 $ があります。 $ 1 $ の別の列を追加します。ベクトル $ 0、\ ldots、0,1 $ (modulo 2)に合計する行のサブセットがあるかどうかを知りたいです。多項式の時間にガウス除去を使用して調べることができます。

ここで何が起こっているの?元のエッジ頂点入射行列を考えてみましょう。各頂点が正確に2つのエッジで現れるので、サイクル合計に対応する行がゼロに対応する行。逆に、一連の行をゼロに合計すると、各頂点の程度は偶数です。任意のエッジから始めて、最終的に自分自身の上に閉じるであろう散歩を追跡できます。対応するサイクル(元のエッジを含める必要はありません)を削除して続行します。このようにして、ゼロに合計される一連の行は、サイクルのエッジ希釈集合に対応していることがわかります。

追加の列を行列に追加することで、サイクルのパリティを追跡しています。奇数サイクルは、ベクトル $ 0、\ ldots、0,1 $ に合計します。逆に、一連の行が $ 0、\ ldots、0,1 $ に合計されている場合、それは全長が奇数である一連のサイクルに対応します。サイクルは奇数です。

最後に、ベクトルが行列の行空間にあるかどうかを見つけることは線形代数の標準的な問題であり、これはガウスの除去および関連するアルゴリズムを使用して解決することができます。

ライセンス: CC-BY-SA帰属
所属していません cs.stackexchange
scroll top