グラフに孤立した頂点がないと仮定すると、max(|sources|,|sinks|) 個のエッジを追加するだけで強く接続できます。
T={t 1 ,…,t n } を DAG のシンクとし、{s 1 ,…,s m } を DAG のソースとする。n <= m とします。(他のケースも非常に似ています)。次のように定義された 2 つのセット間の 2 部グラフ G(T,S) を考えます。G(T,S) がエッジ (t i ,s j ) を持つのは、s jから t iに到達できる場合のみです。
M を G(T,S) の最大マッチングとする。一般性を失うことなく、M が k 個のエッジで構成されると仮定します: {(t 1 ,s 1 ),(t 2 ,s 2 ),…,(t k ,s k )}。元のグラフ DAG G に、有向辺 {(t 1 ->s 2 ),(t 2 ->s 3 ),…,(t k−1 ->s k ),(t k ->s 1 )}。これらのエッジを追加することで、M によって誘導された頂点が G で強く接続されていることが簡単にわかります。
ここで、G(T,S) の残りの頂点を考えます。M が最大であるため、S-M (それぞれ T-M) の各頂点は T (それぞれ S-M) の頂点に接続する必要があります。したがって、残りの頂点を任意にペアにし、たとえば {(t k+1 ,s k+1 ),…,(t n ,s n )} とし、対応する有向辺を G に追加します。残りのソース頂点ごとにソース s i (i は {n+1,…,m} に属します。G にエッジ (t 1 ->s i ) を追加します。したがって、追加されるエッジの総数は max(|sources|,|sinks|) です。
編集:いくつかの例を追加する
入力の例について。最初に最大マッチングを計算します。たとえば、次のようにします。
3--1
4--2
7--5
8--6
したがって、エッジを追加します。
3->2
4->5
7->6
8->1
マッチングに存在しない残りの (シンク) 頂点は 9 であるため、9 からの弧をマッチングの任意のソース頂点に追加します9->1
。
アルゴリズムのすべてのステップを示す別の例を次に示します。
入力グラフ:
12 3 5 9 10 (sources)
\|/ /|\ \/
4 6 7 8 11 (sinks)
最大マッチング:
4--1
6--5
11--9
したがって、エッジを追加します。
4->5
6->9
11->1
現在、残りのシンクは{7, 8}
であり、残りのソースは{2, 3, 10}
です。任意に 7 を 2 と、8 を 3 とペアにして追加します。
7->2
8->3
最後に、残りの (ソース) 頂点は 10 であり、以下を追加します。
4->10