解決策は、すべての頂点の出力次数を計算して、1 つのシンク頂点 (出力次数が 0 の頂点) があるかどうかを確認することです。これが証明です。
ステートメント: DAG には、出角度が 0 の単一の頂点が 1 つある場合にのみ、他のすべての頂点から到達可能な頂点があります。
このステートメントは、2 つのステップで証明できます。
必要性の証明: DAG に他のすべての頂点から到達可能な頂点 u が含まれている場合、それは唯一のシンク頂点 (出次数が 0 の頂点) でなければなりません。
- u は出次数が 0 であり、それ以外の場合は循環形式であり、DAG に矛盾します。
- 出次数が 0 の別のシンク頂点 v は存在できません。そうでない場合、v から u に到達できません。
証明された。
十分性の証明: DAG に 1 つのシンク頂点 u が含まれている場合、u は他のすべての頂点から到達可能である必要があります。
u に到達できない頂点が DAG に存在すると仮定します。DAG 内のすべての頂点を、u に到達できる頂点のセット ($V_y$) と u に到達できない頂点のセット ($V_n$) に分割すると、$V_n$ の頂点からのエッジは存在しません。 $V_y$。
補題: どの DAG にも、少なくとも 1 つのシンク頂点が含まれている必要があります。
これは矛盾によって簡単に証明できます。DAG 内のすべての頂点の出度がゼロでないと仮定すると、1 つの頂点から始めて、各頂点の出て行くエッジに沿って移動し続けることができます。DAG には有限数の頂点が含まれているため、最終的には以前に訪れた頂点に戻ります。つまり、サイクルが検出され、DAG の定義に反します。
$V_n$ の頂点とそれらの間のエッジによって形成されるグラフを考えてみましょう。これも DAG である必要があります。そうでない場合、元のグラフは DAG になることはできません。v がこのサブ DAG のシンク頂点であると仮定すると、v には $V_n$ の頂点を指す出力エッジがありません。
前述のように、v から $V_y$ 内の頂点を指すエッジも存在できません。そうでない場合、v は u に到達できます。
したがって、元の DAG の v の全体的な出次数も 0 であり、DAG に単一のシンク頂点が含まれるという仮定に矛盾します。証明された。