グラフは循環的であるため(つまり、循環を含めることができる)、最初にグラフを強く連結されたコンポーネントに分解します。有向グラフの強連結成分は、各ノードが同じサブグラフ内の他のすべてのノードから到達可能であるサブグラフです。これにより、一連のサブグラフが生成されます。複数のノードの強く接続されたコンポーネントは、事実上サイクルであることに注意してください。
これで、各コンポーネントで、1つのノードの情報は、最終的にグラフの他のすべてのノードに到達します(すべて到達可能であるため)。したがって、サブグラフごとに、その中のすべてのノードからすべてのデータを取得し、すべてのノードに同じデータセットを持たせることができます。サイクルを続ける必要はありません。また、このステップの最後に、同じコンポーネント内のすべてのノードにまったく同じデータが含まれます。
次のステップは、強く接続された各コンポーネントを単一のノードに折りたたむことです。同じコンポーネント内のノードはすべて同じデータを持ち、したがって基本的に同じであるため、この操作は実際にはグラフを変更しません。新しく作成された「スーパーノード」は、コンポーネントの外部のノードからコンポーネントのノードに出入りするすべてのエッジを継承します。
強く連結されたすべてのコンポーネントを折りたたんだため、結果のグラフにはサイクルがありません(結果のノードによって形成されたサイクルがあった場合、そもそもそれらはすべて同じコンポーネントに配置されていたはずです)。結果のグラフは、有向非巡回グラフになります。サイクルはなく、indegree = 0のすべてのノード(つまり、入力エッジのないノード)からの単純な深さ優先探索で、各ノードから隣接するノード(つまり「子」)にデータを伝播する必要があります。 。