ベストアンサー
有向グラフの強連結成分(SCC)は次のいずれかです。サイクルまたは個々の頂点。
グラフにDFSを適用し、生成されたDFSツリーの各ノードの2つのプロパティを追跡します。1。DFSで最初に検出された時間(または順序)。(たとえば、p1)2。到達できる最も古い祖先の順序。(たとえば、p2)最初は、両方ともすべてのノードで同じです。 1番目のプロパティは一定のままですが、2番目のプロパティは再帰的なDFS呼び出し中に更新され、祖先へのバックエッジを見つけるために使用される場合があります。隣接するすべての頂点への再帰的DFS呼び出しの後で両方が同じである場合、どの頂点でも、それは1のいずれかです。どのサイクルの一部でもない個々の頂点。または2.サイクルの一部であるため、(生成されたDFSツリー内の)すべての子孫がそれに到達できます(その祖先に到達できません)。つまり、このノードから開始して終了することができます。 2番目のケースでは、印刷するすべての子孫を追跡できます。
このアニメーションは、説明を理解するのに役立ちます(最初の整数はp1、2番目はp2):
@ File:TarjanのアルゴリズムAnimation.gif
詳細な説明とc ++の実装: Tarjan “s強く接続されたコンポーネントを見つけるアルゴリズム-GeeksforGeeks
PS:このアルゴリズムは、アーティキュレーションポイント、ブリッジ、および2連結グラフの検索と非常によく似ています。したがって、これらを最初に学習することで、アルゴリズムをより直感的に理解できるようになります。 http://www.geeksforgeeks.org/articulation-points-or-cut-vertices-in-a-graph/ http://www.geeksforgeeks.org/bridge-in-a-graph/
回答
アルゴリズムは、入力として有向グラフを受け取り、グラフの頂点をグラフの強連結成分に分割します。グラフの各頂点は、強連結成分の1つに正確に表示されます。有向サイクル上にない頂点は、それ自体で強く接続されたコンポーネントを形成します。たとえば、次数または次数が0の頂点、または非巡回グラフの頂点です。
アルゴリズムの基本的な考え方は次のとおりです。深さ優先探索は任意の開始ノードから開始されます(その後、深さ優先探索はまだ検出されていないノードで実行されます)。深さ優先探索の場合と同様に、検索はグラフのすべてのノードに1回だけアクセスし、既に探索されているノードに再度アクセスすることを拒否します。したがって、探索木のコレクションは、グラフのスパニングフォレストです。強く接続されたコンポーネントは、このフォレストの特定のサブツリーとして復元されます。これらのサブツリーのルートは、強連結成分の「ルート」と呼ばれます。強く接続されたコンポーネントのノードは、検索によって検出されたコンポーネントの最初のノードである場合、ルートとして機能する可能性があります。