백준 No.11404 [플로이드]
본문 바로가기
Algorithm (C++ based)/BOJ

백준 No.11404 [플로이드]

by 조훈이 2021. 2. 20.

BOJ No.11404 [플로이드]

Floyd-Warshall Algorithm


 Problem 

 

11404번: 플로이드

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net


 Code 

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
#include <iostream>
#include <vector>
 
using namespace std;
typedef unsigned long long ull;
 
int V, E;
const ull INF = ull(1e15);
vector<vector<ull>> floyd;
 
int main() {
    cin >> V >> E;
    floyd.assign(V + 1vector<ull>(V + 1, INF));
 
    for (int i = 1; i <= V; i++) floyd[i][i] = 0;
 
    for (int i = 0; i < E; i++) {
        ull s, e, cst;
        cin >> s >> e >> cst;
 
        floyd[s][e] = min(floyd[s][e], cst);
    }
 
    for (int visit = 1; visit <= V; visit++) {
 
        for (int i = 1; i <= V; i++) {
            for (int j = 1; j <= V; j++) {
                if (i != visit && j != visit) {
                    floyd[i][j] = min(floyd[i][j], floyd[i][visit] + floyd[visit][j]);
                }
            }
        }
 
    }
 
    for (int i = 1; i <= V; i++) {
        for (int j = 1; j <= V; j++)
            cout << (floyd[i][j] != INF ? floyd[i][j] : 0<< ' ';
        cout << '\n';
    }
}
cs

 How to solve 

  Floyd-Warshall Algorithm에 대해서 가장 기본적인 문제이다. 문제의 조건에서, 두 vertex 사이 edge가 여러개 있을 수 있다고 했으므로 #21 line 에선 floyd[ s ][ e ] 에 현재 floyd[ s ][ e ]의 값과 현재 입력된 값인 cst중 더 작은 값으로 floyd[ s ][ e ]를 갱신해 주었다.

 

  Floyd-Warshall Algorithm를 참고하면 된다.

728x90

'Algorithm (C++ based) > BOJ' 카테고리의 다른 글

백준 No.17386 [선분 교차 1]  (0) 2021.06.28
백준 No.7579 [앱]  (0) 2021.02.22
백준 No.11779 [최소비용 구하기2]  (0) 2021.02.19
백준 No.13913 [숨바꼭질4]  (0) 2021.02.16
백준 No.13549 [숨바꼭질3]  (0) 2021.02.16

댓글