Menu
Coddy logo textTech

最短経路

Coddyの「グラフ - データ構造シリーズ #9」コースのレッスン 12/14。

start から end に到達するのに、最小で何本のエッジが必要でしょうか?重みなしグラフ(すべてのエッジのコストが等しい)では、その答えはまさに BFS が計算するものです。BFS は開始地点からの距離が近い順に頂点を訪問するため、最初に end に到達したときが最短経路となります。

コツは、各頂点をそれまでの距離と一緒にエンキューすることです。(start, 0) から始めます。距離 d の頂点から新しい隣接頂点 v を見つけるたびに、(v, d + 1) をエンキューします。v == end のとき、d + 1 を返します。

2つのエッジケースがあります。もし start == end なら、答えは 0 です。もし BFS が end に到達せずに終了した場合、これら2つは異なる連結成分にあり、答えは -1 となります。

challenge icon

チャレンジ

簡単

2次元整数配列 adjacency、整数 start、および整数 end を受け取り、start から end までの最短距離(エッジ数)を返す関数 shortestPath を作成してください。

  • start == end の場合は、0 を返します。
  • start から end に到達できない場合は、-1 を返します。
  • それ以外の場合は、それらの間の最小エッジ数を返します。

必ず Graph クラスを使用してくださいgraph で提供されています)。隣接関係をモデル化するために言語の組み込み機能(マップ、セットなど)を使用しないでください。アルゴリズムの補助データ(訪問済みセット、キューなど)には標準ライブラリの型を使用しても構いません。

自分で試してみよう

#include <stdio.h>
#include "solution.h"

int main() {
    int n, m, start, end;
    if (scanf("%d %d %d %d", &n, &m, &start, &end) != 4) return 0;
    int adjacency[1024][2];
    for (int i = 0; i < m; i++) scanf("%d %d", &adjacency[i][0], &adjacency[i][1]);
    printf("%d\n", shortestPath(adjacency, m, start, end));
    return 0;
}

グラフ - データ構造シリーズ #9のすべてのレッスン