HopcroftとKarp -Wikipediaのアルゴリズム

before-content-x4

HopcroftとKarpのアルゴリズム (1973年にJohn E. HopcroftとRichard M. Karpによって開発されました)は、グラフ理論で使用され、二部の最大のカーディナリティとのマッチングを決定します。それはマッチングから抜け出しますが、これにはエッジが含まれていません。また、まだ対応のない結び目の間に交互のパスを構築します。そのようなパスはそれぞれ、1つのエッジの周りに一致する拡大(増強)を提供します。

after-content-x4

エッジのエッジを持つグラフです

{displaystyle e}

マッチング

m {displaystyle msubset e}

与えられると、木であるコヒーレントサブグラフ、つまりサイクルが含まれておらず、存在することを検討してください

  • 未払いの結び目として
  • ツリー内の根から到達できるペアの結び目 代わりの ストレートエッジのパス。 交互 パスのエッジも交互に行うことを意味します
  • 交互のパスに沿ったすべてのノットとエッジ。これには、ルートから奇妙な距離を持つノードも含まれます。

一般的なノードを持っていないそのような木の量は呼び出されます

結び目

バツ {displaystyle x}

{displaystyle y}

森の2つの異なる木から、それぞれが根からまっすぐに、端を通ります

after-content-x4
バツ {displaystyle xyin e}

このエッジを接続できない場合

m {displaystyle m}

ノットは、とにかく対応していないルートでない限り、別の端でツリー内ですでにペアになっているためです。エッジの端のあるパス

p {displaystyle p}

1つの木の根元から

バツ {displaystyle xy}

他のツリーのルートには、対応のないスタートとエンドノードのある交互のパスがあります。そのような道はなります

m {displaystyle m}

– パスを獲得します なぜなら、なぜなら

m p )) p m )) {displaystyle(msetminus p)カップ(psetminus m)}

エッジを含むマッチングです

m {displaystyle m}

逆に、マッチングが適用されます

m {displaystyle m ‘}

それにはより多くのエッジが含まれています

m {displaystyle m}

、エッジの量のサブグラフ

m m )) m m )) {displaystyle(msetminus m ‘)cup(m’setminus m)}

その間のすべてのパスが結果です

m {displaystyle m}

m {displaystyle m ‘}

代替、そして少なくとも

| m | | m | {displaystyle | m ‘| – | m |}

m {displaystyle m}

– 自動化は相互ノードなしでなければなりません。

m {displaystyle m}

したがって、何もない場合、それは最大のマッチングです

m {displaystyle m}

– パスを獲得します。

ハンガリーの森 [ 編集 | ソーステキストを編集します ]

検討中の森林を定義するとき、二部グラフがあるとはまだ想定されていません。二部グラフで

)) {displaystyle(ucup v、e)}

しかし、さらに適用されます:そこには、のルートから直接距離があります

{displaystyleu}

また

{displaystyle v}

、ルートがどこにあるかに応じて。森に結び目がない場合

バツ {displaystyle x}

{displaystyle y}

バツ {displaystyle xyin e}

最後のセクションのように、森林は、言及されている特性に準拠して拡大することができなくなりましたが、それは1つと呼ばれています ハンガリーの森 。二極性のため、ハンガリーの森があるときにマッチングが最大のマッチングであることを示すことができます。

アルゴリズム [ 編集 | ソーステキストを編集します ]

次のアルゴリズムは、HopcroftとKarpのアルゴリズムの予備段階です。彼は一致して二部グラフを構築します

m {displaystyle m}

言及されたプロパティのある森、それ

  1. 森から始めます。森は、すべての対応のないノードを根として含みますが、エッジはありません。
  2. 結び目の端を見つけます

最初にアルゴリズム

m = {displaystyle m = emptyset}

実行された。彼がステップ3にいる場合

m {displaystyle m}

– パスを獲得します

p {displaystyle p}

終わり、意志

m {displaystyle m}

終えた

m p )) p m )) {displaystyle(msetminus p)カップ(psetminus m)}

交換すると、アルゴリズムが再度実行されました。アルゴリズムがステップ2でハンガリーの森で終わる場合、次に

m {displaystyle m}

最新の後、最大のマッチングです

| | + | | )) / 2 {displaystyle(| u |+| v |)/2}

他のケースでは、一致が2ノット増加するため、アルゴリズム全体が発生します。アルゴリズムの1回の実装を使用したランタイムは、エッジの数に比例します

| | {displaystyle | e |}

、実装が繰り返される合計項は、エッジとノットの数の積に比例します。

Hopcroft-Karp-exemple-premiere-partie.jpg
Hopcroft-Karp-exemple-deuxieme-partie.jpg

この例の二部グラフには、10ノットと10のエッジがあります。左側では、すべてのノットが最初のフェーズの前に無料で、マッチングは空です。すべての拡張パスは、の結び目の間の単一の端にあります

{displaystyleu}

と結び目

{displaystyle v}

削減。たとえば、幅の検索でエッジが選択されます。

0 0 )) 初め 4 )) 2 2 )) 4 初め )) {displaystyle(u_ {0}、v_ {0})、(u_ {1}、v_ {4})、(u_ {2}、v_ {2})、(u_ {4}、v_ {1})}

結び目ごとに

{displaystyleu}

自由な結び目

{displaystyle v}

最小のインデックスで選択されています。この量のパスは最大であり、すべて同じ長さ1、保存されたマッチングにはサイズ4、2つのフリーノットが残り、2つのフリーノットが残ります。

3 {displaystyle u_ {3}}

3 {displaystyle v_ {3}}

2番目のフェーズは、

{displaystyleu}

またはの唯一のフリーノードから

{displaystyle v}

見つけるには。指定されたパス

3 0 0 初め 4 3 )) {displaystyle(u_ {3}、v_ {0}、u_ {0}、v_ {1}、u_ {4}、v_ {3})}

マッチング内のマッチングエッジと赤いエッジの外側の黒いエッジを切り替えます。彼は長さ5の長さです。長さ3のパスはないことがわかりますが、長さ7のパスがあります。

3 4 初め 0 0 初め 4 3 )) {displaystyle(u_ {3}、v_ {4}、u_ {1}、v_ {0}、u_ {0}、v_ {1}、u_ {4}、v_ {3})}

。長さ5のパスとの以前のマッチングの対称的な違いに起因するマッチングは、サイズ5の例になります。これは、自由ノードがもうないために最大です。

アルゴリズムの合計期間は、いくつかの場合に減らすことができます

m {displaystyle m}

– パスを同時に表示できます。そうです

l m )) {displaystyle l(m)}

最短の長さ

m {displaystyle m}

– パスを獲得します。私たちは見ます

m {displaystyle m}

-Augmenting Knotty Junks Paths

p 初め p m {displaystyle p_ {1}、ldots、p_ {m}}

長さ

l m )) {displaystyle l(m)}

もう誰も

m {displaystyle m}

– 長さの経路

l m )) {displaystyle l(m)}

追加できます。その後、それを示すことができます

after-content-x4