BOJ

[백준] 11403번 경로찾기 - C++

플로이드 워셜

Posted by dongjune on May 22, 2021

문제링크

11403번 경로찾기

풀이

임의의 정점 i,j에 대해 i에서 j로 가는 경로가 있는지 알아내는 문제입니다.
플로이드 워셜 알고리즘을 사용하여 모든 (i,j)에 대해 i에서 j로 가는 최소경로를 구해준 후 만약 경로가 없으면 0, 있으면 1을 출력해줍니다.

플로이드 워셜 알고리즘은 다음과 같이 3중 for문으로 구현할 수 있습니다.
fr정점에서 to 정점을 갈때 거쳐가는 모든 bridge 정점을 체크하며 최소경로를 갱신합니다.

1
2
3
4
5
6
7
8
9
// 플로이드 워셜 알고리즘 사용
  for (int bridge = 1; bridge <= N; bridge++) {
    for (int fr = 1; fr <= N; fr++) {
      for (int to = 1; to <= N; to++) {
        matrix[fr][to] =
            min(matrix[fr][to], matrix[fr][bridge] + matrix[bridge][to]);
      }
    }
  }

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <algorithm>
#include <iostream>

using namespace std;

const int INF = 1000;
int N;
int matrix[101][101];

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);

  cin >> N;
  // 초기화
  for (int i = 1; i <= N; i++){
    for (int j = 1; j <= N; j++) {
      cin >> matrix[i][j];
      if (matrix[i][j] == 0) matrix[i][j] = INF;
    }
  }

  // 플로이드 워셜 알고리즘 사용
  for (int bridge = 1; bridge <= N; bridge++)
    for (int fr = 1; fr <= N; fr++)
      for (int to = 1; to <= N; to++)
        matrix[fr][to] =
            min(matrix[fr][to], matrix[fr][bridge] + matrix[bridge][to]);

  // 결과 출력
  for (int i = 1; i <= N; i++) {
    for (int j = 1; j <= N; j++) {
      if (matrix[i][j] == INF)
        cout << 0 << ' ';
      else
        cout << 1 << ' ';
    }
    cout << '\n';
  }

  return 0;
}