본문 바로가기
Algorithm/BOJ

[BOJ] 백준 11404 - 플로이드

by JJuOn 2021. 8. 9.

2021.08.09 - [Algorithm/Theory] - [Algorithm] Floyd-Warshall Algorithm(플로이드-와샬 알고리즘)

문제 링크

 

11404번: 플로이드

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

www.acmicpc.net

도시(정점), 버스(간선), 버스의 비용(가중치)를 갖는 그래프에서, 모든 도시(정점) 의 쌍 (A,B)에 대해 A에서 B로 가는데 필요한 최소 비용을 구하는 문제이다.

문제의 제목과 같이 Floyd-Warshall 알고리즘으로 해결 할 수 있었다.

해당 알고리즘은 아래 링크에서 확인할 수 있다.

2021.08.09 - [Algorithm/Theory] - [Algorithm] Floyd-Warshall Algorithm(플로이드-와샬 알고리즘)

 

[Algorithm] Floyd-Warshall Algorithm(플로이드-와샬 알고리즘)

Floyd-Warshall 알고리즘은 기존에 포스팅했던 Dijkstra 알고리즘이나 Bellman-Ford 알고리즘과 다르게, 모든 정점들 사이의 최단거리를 계산하는 알고리즘이다. 그래프의 초기 상태는 다음과 같다. 두 정

jjuon.tistory.com

 

기존의 다른 그래프 문제에서는 인접 리스트(Adjacency List)로 구현한 사례가 많았지만,

이번 문제에서는 정점의 수가 2개이상 100개 이하로 많지 않아 인접 행렬(Adjacency Matrix)로 구현했다.

#include <iostream>

#define INF 100000000
using namespace std;

int dist[101][101];

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (i == j) {
                dist[i][j] = 0;
            }
            else {
                dist[i][j] = INF;
            }
        }
    }
    for (int i = 0; i < m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        dist[a][b] = dist[a][b] < c ? dist[a][b] : c;
    }
    for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (dist[i][j] > dist[i][k] + dist[k][j]) {
                    dist[i][j] = dist[i][k] + dist[k][j];
                }
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (dist[i][j] == INF) {
                cout << "0 ";
            }
            else {
                cout << dist[i][j] << " ";
            }
        }
        cout << "\n";
    }
    return 0;
}

위 소스코드에서 정점 i에서 정점 j로 가는 간선이 여러개 있을 수 있으므로

dist[a][b] = dist[a][b] < c ? dist[a][b] : c;

이 부분에서 가중치가 최소인 간선 하나만 택하도록 했다.

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 백준 11660 - 구간 합 구하기 5  (0) 2021.08.11
[BOJ] 백준 1865 - 웜홀  (0) 2021.04.06
[BOJ] 백준 1753 - 최단경로  (0) 2021.04.06
[BOJ] 백준 1222 - 홍준 프로그래밍 대회  (0) 2021.04.01

댓글