Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

グラフ

グラフ(Graph) は、頂点(ノード, vertex) と 辺(エッジ, edge) からなるデータ構造

G=(V,E)G = (V, E)
  • VV:頂点の集合

  • EE:辺の集合(頂点のペア)

現実世界の多くの問題をグラフとしてモデル化できる(地図・道路網、SNSの友人関係、タスクの依存関係など)

グラフの種類

種類説明
無向グラフ(Undirected)辺に向きがない。(u,v)(u, v) と (v,u)(v, u) は同じ辺
有向グラフ(Directed, Digraph)辺に向きがある。(u,v)(u, v) と (v,u)(v, u) は別の辺
重み付きグラフ(Weighted)各辺にコスト(重み)が付いている
DAG(有向非巡回グラフ)有向グラフで閉路(サイクル)がないもの
木(Tree)連結で閉路のない無向グラフ。$

グラフの表現方法

隣接行列(Adjacency Matrix)

∣V∣×∣V∣|V| \times |V| の行列 AA で表す。A[u][v]=1A[u][v] = 1(または重み)なら辺 (u,v)(u, v) が存在する

  • 辺の存在確認:O(1)O(1)

  • 隣接頂点の列挙:O(∣V∣)O(|V|)

  • 空間計算量:O(∣V∣2)O(|V|^2)(疎なグラフには非効率)

隣接リスト(Adjacency List)

各頂点が隣接する頂点のリストを持つ

  • 辺の存在確認:O(deg⁡(u))O(\deg(u))

  • 隣接頂点の列挙:O(deg⁡(u))O(\deg(u))

  • 空間計算量:O(∣V∣+∣E∣)O(|V| + |E|)(疎なグラフに効率的)

幅優先探索(BFS)

始点から近い頂点から順に探索する。キューを使う

  • 計算量:O(∣V∣+∣E∣)O(|V| + |E|)

  • 用途:最短経路(辺の重みが均一な場合)、連結成分の判定

深さ優先探索(DFS)

できる限り深く探索してから戻る。スタック(または再帰)を使う

  • 計算量:O(∣V∣+∣E∣)O(|V| + |E|)

  • 用途:連結成分の判定、トポロジカルソート、閉路検出

トポロジカルソート

DAG(有向非巡回グラフ)の頂点を、すべての辺 (u,v)(u, v) において uu が vv より前になるよう並べる

タスクの依存関係の解決やビルドシステムなどに使われる

カーン法(Kahn’s algorithm)を使う:入次数(in-degree)が 0 の頂点をキューに入れ、順番に取り出す

  • 計算量:O(∣V∣+∣E∣)O(|V| + |E|)

ダイクストラ法

重み付きグラフで、始点から各頂点への最短経路を求める

  • 辺の重みが非負であることが前提

  • 計算量:優先度付きキューを使うと O((∣V∣+∣E∣)log⁡∣V∣)O((|V| + |E|) \log |V|)

  • 用途:地図アプリの経路探索、ネットワークのルーティング

まとめ

アルゴリズム計算量用途
BFS$O(V
DFS$O(V
トポロジカルソート(カーン法)$O(V
ダイクストラ法$O((V
グラフ表現の選択
  • 密なグラフ(∣E∣≈∣V∣2|E| \approx |V|^2)→ 隣接行列が有利(辺の存在を O(1)O(1) で確認)

  • 疎なグラフ(∣E∣≪∣V∣2|E| \ll |V|^2)→ 隣接リストが有利(空間効率が良い)

競技プログラミングやシステム設計では疎なグラフが多いため、隣接リストが一般的