方向を持つ矢印(エッジ)でノード間の関係を表すグラフ
有向グラフ(Directed Graph)とは、ノード(頂点=丸)と、それらを方向を持つ矢印でつなぐエッジ(辺)で物事の関係を表した図のことです。矢印が「A→B」なら「AからBへ向かう関係」を意味し、その逆「B→A」は別物として扱います。
身近な例で言うと、SNSのフォローが分かりやすいです。あなたが芸能人をフォローしても、芸能人があなたをフォローし返すとは限りません。この「片思い」のような一方通行の関係を、矢印一本で表せるのが有向グラフです。
上のツールでプリセットを切り替え、ノードをクリックしてみてください。そのノードから出ていく矢印(出次数)と入ってくる矢印(入次数)が色分けされ、隣接関係がリアルタイムで一覧表示されます。
有向グラフを構成する2つの要素を整理します。
・ノード(頂点 / vertex):関係の「主体」。人・タスク・Webページなど何でも表せる
・エッジ(辺 / edge):ノード間の「つながり」。有向グラフでは向きを持つ矢印になる
各ノードには次数(degree)という指標があります。有向グラフでは2種類に分かれます。
・出次数:そのノードから出ていく矢印の本数
・入次数:そのノードへ入ってくる矢印の本数
たとえば「A→B」「C→B」という2本の矢印があれば、Bの入次数は2、出次数は0です。あるノードに入ってくる/出ていく辺の数を数えるときは、矢印の向きをていねいに追うことが大切です。
有向グラフは「向きのある関係」を表せるため、IT分野で非常に幅広く使われます。代表的な用途を挙げます。
・作業の依存関係:「設計→実装→テスト」のように順番が決まった工程の管理(PERT図・トポロジカルソート)
・経路・到達可能性:地図の一方通行や、Webページのリンク構造(Googleのページランクなど)
・状態遷移:プログラムの状態が「待機→実行→終了」と移り変わる様子
身近な例では、料理のレシピも有向グラフです。「お湯を沸かす→麺を入れる→3分待つ→盛り付ける」のように、各工程には順番(向き)があり、前の工程が終わらないと次に進めません。この前後関係をグラフで表すと、どの作業を先にすべきか・並行できるかが一目で分かります。
重要なポイントとして、矢印をたどると元のノードに戻る閉路(サイクル)の有無があります。依存関係に閉路があると「AはBの後、BはAの後」と堂々巡りになり処理が進みません。プリセット「循環するルート」でこの構造を確認できます。