概要
このチュートリアルでは、無向グラフ内の連結成分の概念について説明します。
私たちは、基本的な理解を得るためにいくつかの簡単な例を通過し、我々は接続されたコンポーネントのプロパティを一覧表示します。
連結成分定義
連結成分または単に無向グラフの成分は、ノードの各ペアがパスを介して互いに接続されている部分グラフです。しかし、それをさらに単純化しようとしましょう。
ノードのセットからのノードがエッジを横断することによって他のノードに到達できる場合、ノードのセットは無向グラフ内の接続コンポーネントを形成し ここでの主なポイントは到達可能性です。
接続されたコンポーネントでは、すべてのノードは常に互いに到達可能です。
いくつかの例
このセクションでは、いくつかの簡単な例について説明します。 例を上記の定義と関連付けることを試みます。3.1.
3.1. 一つの連結成分
この例では、与えられた無向グラフには一つの連結成分があります:このグラフに名前を付けてみましょう:
- e4\rightarrow e7\または\E3\Rightarrow E5\Rightarrow e7\または\e1\rightarrow e2\rightarrow E6\Rightarrow E7
頂点の他の頂点ペアも同様です。3.2.
3.2. 複数の連結成分
この例では、無向グラフには三つの連結成分があります:
Let’s name this graph as , where , and . The graph has 3 connected components: and を選びましょう。p>
- ここで、頂点を選んでみましょうc2。
- is reachable to
- is reachable to
Finally, let’s pick the vertices and from the set .
- is reachable to
したがって、これらの簡単なデモから、接続されたコンポーネント定義に従います。
プロパティ
すでに定義を議論し、接続されたコンポーネントの例をいくつか示してきたように、接続されたコンポーネントが常に保持する重要
まず、接続されたコンポーネントセットは常に空ではありません。
さらに、与えられたグラフに複数の接続成分がある場合、接続成分の和集合は与えられたグラフのすべての頂点の集合を与えます。
たとえば、:
最後に、接続されたコンポーネントセットはペアワイズ互いに素です。 つまり、2つの異なる接続されたコンポーネントセット間の交点を取ると、その交点は空のセットまたはnullセットに等しくなります。グラフ、このプロパティをチェックしてみましょう:
接続されたコンポーネントの検索
無向グラフを考えると、グラフの構造を分析するために接続されたコンポーネ このタスクにはDFSまたはBFSのいずれかを使用できます。
このセクションでは、与えられた無向グラフの接続されたコンポーネントの数を与えるDfsベースのアルゴリズムについて説明します。
変数Component_Countは、与えられたグラフ内の接続されたコンポーネントの数を返します。
まず、すべての頂点を訪問していないフラグに初期化します。 次に、任意のランダムな頂点を選択して開始し、頂点を訪問したかどうかを確認します。 そうでない場合は、DFS関数を呼び出します。
訪問されたとマークされたすべての頂点が終了すると、アルゴリズムは終了し、接続されたコンポーネントの数を出力します。
DFS関数では、渡す引数は、与えられたグラフのすべての頂点と、頂点セットに属している必要がある特定の頂点を含む頂点セットです。
まず、特定の入力頂点をvisitedとしてマークします。 次に、与えられた特定の入力頂点の隣接する頂点を計算します。 隣接する各頂点について、それらを訪問したかどうかを確認します。 そうでない場合は、隣接するすべての頂点を訪問済みとしてマークするまで、dfs関数を再帰的に呼び出します。
アルゴリズムで観察するための重要なポイントは、接続されたコンポーネントの数が独立したDFS関数呼び出しの数に等しいことです。 Component_Count変数は、呼び出しの数をカウントします。 もちろん、これにはdfs()関数の下で再帰的に行われている呼び出しは含まれません。
テスト実行
サンプルグラフでアルゴリズムを実行してみましょう:v=\{V1,V2,V3,V4,V5,V6,V7,V8\}
無向グラフが与えられた場合.
アルゴリズムの最初のステップは、すべての頂点を初期化し、それらを訪問していないとしてマークすることです。赤い頂点は、それが訪問されていないことを示しています。
緑の頂点は、それがアルゴリズムによって訪問されていることを示します:
頂点リストから任意の頂点を選択してアルゴ を選んでみましょう。
アルゴリズムは、それが訪問されているかどうかをチェックします。 この場合、を呼び出します。
DFS()内で、最初に頂点の隣接頂点を検索します。 隣接するすべての頂点も訪問済みとしてマークされます。 DFSがの隣接するすべての頂点の訪問を終了すると、Component_Countは1になり、頂点のステータスが更新されます:
ここでも、アルゴリズムは任意のランダムな頂点を選択します。 今回はを選びましょう。p>
マークを訪問済みとしてマークし、DFSは隣接する頂点を検索して訪問済みとしてマークします。 これでComponent_Countは2になり、頂点リストのステータスが再び更新されます:アルゴリズムは続行され、とその隣接する頂点はvisitedとしてラベル付けされ、Component_Countは3に増加します。 最後に、アルゴリズムはには隣接する頂点がないため、DFSが返され、Component_Countが4に増加します。 最後に、アルゴリズムは頂点リストのステータスを更新します。
アルゴリズムがグラフのすべての頂点をトラバースし終えるとの接続されたコンポーネントの数に等しいComponent_Countの値を返します。 この場合、アルゴリズムはで四つの連結成分を見つけます:p>
,.
時間複雑度分析
与えられた無向グラフ内の接続されたコンポーネントを見つけるために見たアルゴリズムは、DFS検索を使用し、DFS関数への呼 グラフが隣接リストで表されている場合、DFS検索は、無向グラフの場合には、すべての頂点を1回、各エッジを2回訪問します。 頂点ステータスのチェックには、時間を取ります。グラフが隣接行列で表される場合、dfs検索には、隣接頂点を評価するために行全体を走査する必要があるため、o(V^2)時間がかかります。O(1)時間がかかります。 したがって、合計時間を与えます。
結論
この記事では、接続されたコンポーネントの簡単な定義に続いて、シンプルで理解しやすい例をいくつか説明しました。 また、接続されたコンポーネントのいくつかの一般的ではあるが重要な特性を列挙しました。
次に、与えられたグラフ内の接続された成分の数を見つけるためのDFS検索ベースのアルゴリズムについて説明しました。 サンプルグラフの助けを借りてこのアルゴリズムを実証した。 最後に,アルゴリズムの時間複雑性を解析した。