1. 概要

このチュートリアルでは、深さ優先探索(DFS)を使用して無向グラフでサイクルを検出する方法を学習します。

2. グラフとは何ですか?

グラフは、制限された頂点(またはノード)のセットと、これらの頂点を接続するエッジのセットで構成されるデータ構造です。

頂点のセットとエッジのセットを使用して、グラフを定義できます。 すべてのエッジは2つの頂点を接続し、接続された頂点であるとして表示できます。

たとえば、2つの頂点 との間にエッジがある場合、それらを関連付け済みと呼びます。 次に、これら2つを隣接する(隣接する)頂点と呼ぶこともできます。

数学的には、グラフ(頂点、エッジ)を次のように表示できます。

   

   

   

グラフは次の2つのグループに分類できます。

まず、エッジが一方向にしか移動できない場合、グラフをdirectedと呼びます。

たとえば、有向エッジが頂点1と2を接続している場合、頂点1から頂点2にトラバースできますが、反対方向(2から1)は許可されません。 したがって、それはに等しくないと言えます。

ただし、エッジが双方向である場合、グラフを無向と呼びます。

たとえば、無向エッジが頂点1と2を接続している場合、頂点1から頂点2へ、および2から1へトラバースできます。 そうすれば、それはに等しいと言えます。

3. サイクルとは何ですか?

グラフ理論では、特定の頂点から始まり、同じ頂点で終わるパスはサイクルと呼ばれます。

循環検出は、コンピュータサイエンスの主要な研究分野です。 無向グラフでサイクルを検出する複雑さはです。

以下の例では、ノード3-4-5-6-3がサイクルになることがわかります。

4. サイクル検出

次に、無向グラフでサイクルを検出する方法を学びましょう。 具体的には、DFSを使用して実行しましょう。

簡単に言うと、DFSは頂点をスタックに配置します。 いくつかの頂点から始めて、それをスタックにプッシュします。 それで:

  1. 未訪問のネイバーがある場合は、それらのネイバーの1つをスタックにプッシュし、この手順を繰り返します(現在は)
  2. 未訪問のネイバーがなくなったら、スタックからポップしてステップ1に戻ります。

ここで、サイクルを検出するために、DFSのロジックを少し調整できます。次のような訪問済みネイバーがある場合:

  • に等しい、または
  • の親と等しくありません

その後、サイクルがあります。

これを擬似コードに入れると、次のようになります。

そして今、これを使用して、を呼び出すことにより、無向グラフのサイクルを検出できます。

5. 結論

このクイックチュートリアルでは、深さ優先探索に基づいて、無向グラフでサイクルを検出する方法について説明しました。