Algorithm πŸ§‘πŸ»‍πŸ’»/Note

[C++, ν…œν”Œλ¦Ώ] ν”Œλ‘œμ΄λ“œ-와샬

dkswnkk 2022. 5. 13. 19:59

ν”Œλ‘œμ΄λ“œ-와샬 

#include <bits/stdc++.h>
#define INF 1e9 // λ¬΄ν•œμ„ μ˜λ―Έν•˜λŠ” κ°’μœΌλ‘œ 10얡을 μ„€μ •

using namespace std;

// λ…Έλ“œμ˜ 개수(N), κ°„μ„ μ˜ 개수(M)
// λ…Έλ“œμ˜ κ°œμˆ˜λŠ” μ΅œλŒ€ 500개라고 κ°€μ •
int n, m;
// 2차원 λ°°μ—΄(κ·Έλž˜ν”„ ν‘œν˜„)λ₯Ό λ§Œλ“€κΈ°
int graph[501][501];

int main(void) {
    cin >> n >> m;

    // μ΅œλ‹¨ 거리 ν…Œμ΄λΈ”μ„ λͺ¨λ‘ λ¬΄ν•œμœΌλ‘œ μ΄ˆκΈ°ν™”
    for (int i = 0; i < 501; i++) {
        fill(graph[i], graph[i] + 501, INF);
    }

    // 자기 μžμ‹ μ—μ„œ 자기 μžμ‹ μœΌλ‘œ κ°€λŠ” λΉ„μš©μ€ 0으둜 μ΄ˆκΈ°ν™”
    for (int a = 1; a <= n; a++) {
        for (int b = 1; b <= n; b++) {
            if (a == b) graph[a][b] = 0;
        }
    }

    // 각 간선에 λŒ€ν•œ 정보λ₯Ό μž…λ ₯ λ°›μ•„, κ·Έ κ°’μœΌλ‘œ μ΄ˆκΈ°ν™”
    for (int i = 0; i < m; i++) {
        // Aμ—μ„œ B둜 κ°€λŠ” λΉ„μš©μ€ C라고 μ„€μ •
        int a, b, c; cin >> a >> b >> c;
        graph[a][b] = c;
    }
    
    // 점화식에 따라 ν”Œλ‘œμ΄λ“œ μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ„ μˆ˜ν–‰
    for (int k = 1; k <= n; k++) {
        for (int a = 1; a <= n; a++) {
            for (int b = 1; b <= n; b++) {
                graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b]);
            }
        }
    }

    // μˆ˜ν–‰λœ κ²°κ³Όλ₯Ό 좜λ ₯
    for (int a = 1; a <= n; a++) {
        for (int b = 1; b <= n; b++) {
            // 도달할 수 μ—†λŠ” 경우, λ¬΄ν•œ(INFINITY)이라고 좜λ ₯
            if (graph[a][b] == INF) cout << "INFINITY" << ' ';
            // 도달할 수 μžˆλŠ” 경우 거리λ₯Ό 좜λ ₯
            else cout << graph[a][b] << ' ';
        }
        cout << '\n';
    }
}