πŸ•οΈ ICPC Sinchon/Shortest Path

[BOJ G4][C++] λ°±μ€€ 1719번: 택배

선달 2022. 11. 3. 03:08
λ°˜μ‘ν˜•

https://www.acmicpc.net/problem/1719

 

1719번: 택배

λͺ…μš°κΈ°μ—…μ€ 2008λ…„λΆ€ν„° 택배 사업을 μƒˆλ‘œμ΄ μ‹œμž‘ν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€. μš°μ„  택배 화물을 λͺ¨μ•„μ„œ μ²˜λ¦¬ν•˜λŠ” μ§‘ν•˜μž₯을 λͺ‡ 개 λ§ˆλ ¨ν–ˆμ§€λ§Œ, 택배 화물이 각 μ§‘ν•˜μž₯λ“€ 사이λ₯Ό 였갈 λ•Œ μ–΄λ–€ 경둜λ₯Ό 거쳐야 ν•˜

www.acmicpc.net

 

문제

λͺ…μš°κΈ°μ—…μ€ 2008λ…„λΆ€ν„° 택배 사업을 μƒˆλ‘œμ΄ μ‹œμž‘ν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€. μš°μ„  택배 화물을 λͺ¨μ•„μ„œ μ²˜λ¦¬ν•˜λŠ” μ§‘ν•˜μž₯을 λͺ‡ 개 λ§ˆλ ¨ν–ˆμ§€λ§Œ, 택배 화물이 각 μ§‘ν•˜μž₯λ“€ 사이λ₯Ό 였갈 λ•Œ μ–΄λ–€ 경둜λ₯Ό 거쳐야 ν•˜λŠ”μ§€ κ²°μ •ν•˜μ§€ λͺ»ν–ˆλ‹€. μ–΄λ–€ 경둜λ₯Ό 거칠지 μ •ν•΄μ„œ, 이λ₯Ό κ²½λ‘œν‘œλ‘œ μ •λ¦¬ν•˜λŠ” 것이 μ—¬λŸ¬λΆ„μ΄ ν•  일이닀.

μ˜ˆμ‹œλœ κ·Έλž˜ν”„μ—μ„œ ꡡ게 ν‘œμ‹œλœ 1, 2, 3, 4, 5, 6은 μ§‘ν•˜μž₯을 λ‚˜νƒ€λ‚Έλ‹€. μ •μ κ°„μ˜ 간선은 두 μ§‘ν•˜μž₯간에 ν™”λ¬Ό 이동이 κ°€λŠ₯함을 λ‚˜νƒ€λ‚΄λ©°, κ°€μ€‘μΉ˜λŠ” 이동에 κ±Έλ¦¬λŠ” μ‹œκ°„μ΄λ‹€. μ΄λ‘œλΆ€ν„° μ–»μ–΄λ‚΄μ•Ό ν•˜λŠ” κ²½λ‘œν‘œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

κ²½λ‘œν‘œλŠ” ν•œ μ§‘ν•˜μž₯μ—μ„œ λ‹€λ₯Έ μ§‘ν•˜μž₯으둜 μ΅œλ‹¨κ²½λ‘œλ‘œ 화물을 μ΄λ™μ‹œν‚€κΈ° μœ„ν•΄ κ°€μž₯ λ¨Όμ € 거쳐야 ν•˜λŠ” μ§‘ν•˜μž₯을 λ‚˜νƒ€λ‚Έ 것이닀. 예λ₯Ό λ“€μ–΄ 4ν–‰ 5μ—΄μ˜ 6은 4번 μ§‘ν•˜μž₯μ—μ„œ 5번 μ§‘ν•˜μž₯으둜 μ΅œλ‹¨ 경둜λ₯Ό 톡해 κ°€κΈ° μœ„ν•΄μ„œλŠ” 제일 λ¨Όμ € 6번 μ§‘ν•˜μž₯으둜 이동해야 ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€.

이와 같은 κ²½λ‘œν‘œλ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 두 수 nκ³Ό m이 빈 칸을 사이에 두고 μˆœμ„œλŒ€λ‘œ 주어진닀. n은 μ§‘ν•˜μž₯의 개수둜 200μ΄ν•˜μ˜ μžμ—°μˆ˜, m은 μ§‘ν•˜μž₯κ°„ 경둜의 개수둜 10000μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€. μ΄μ–΄μ„œ ν•œ 쀄에 ν•˜λ‚˜μ”© μ§‘ν•˜μž₯κ°„ κ²½λ‘œκ°€ μ£Όμ–΄μ§€λŠ”λ°, 두 μ§‘ν•˜μž₯의 λ²ˆν˜Έμ™€ κ·Έ 사이λ₯Ό μ˜€κ°€λŠ”λ° ν•„μš”ν•œ μ‹œκ°„μ΄ μˆœμ„œλŒ€λ‘œ 주어진닀. μ§‘ν•˜μž₯의 λ²ˆν˜Έλ“€κ³Ό 경둜의 μ†Œμš”μ‹œκ°„μ€ λͺ¨λ‘ 1000μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.

좜λ ₯

μ˜ˆμ‹œλœ 것과 같은 ν˜•μ‹μ˜ κ²½λ‘œν‘œλ₯Ό 좜λ ₯ν•œλ‹€.



풀이

κ°€λŠ₯ν•œ λͺ¨λ“  정점 2개의 쑰합에 λŒ€ν•œ μ΅œλ‹¨κ²½λ‘œλ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄ ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν–ˆλ‹€.
(ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ 은 DP 접근을 기반으둜 ν•˜λŠ” ASP μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.)

μ΄λ•Œ κ·Έλž˜ν”„μ— κ°€μ€‘μΉ˜ (λ³Έ λ¬Έμ œμ—μ„œλŠ” κ±Έλ¦¬λŠ”μ‹œκ°„) 뿐만 μ•„λ‹ˆλΌ μ§€λ‚˜κ°€λŠ” λ…Έλ“œ(μ§‘ν•˜μž₯) 에 λŒ€ν•œ 정보도 담을 수 μžˆλ„λ‘
pair ν˜•νƒœλ‘œ {κ°€μ€‘μΉ˜, μ§€λ‚˜λŠ” λ…Έλ“œ} λ₯Ό λ‹΄μ•„μ£Όμ—ˆλ‹€.

 

// Authored by : seondal
// Co-authored by : -

// #include <bits/stdc++.h>
#include <iostream>
#include <vector>

using namespace std;

typedef pair<int,int> ci;

const int INF = 1e7;

void floydWarshall(int n, vector<vector<ci>>&graph) {
    for(int k=1; k<=n; k++) {
        for(int i=1; i<=n; i++) {
            for(int j=1; j<=n; j++) {
                int passK = graph[i][k].first + graph[k][j].first;
                if(passK < graph[i][j].first) {
                    // k μ§‘ν•˜μž₯을 μ§€λ‚˜λŠ” κ²½μš°κ°€ 더 λΉ λ₯Έκ²½μš°
                    graph[i][j].first = passK;
                    graph[i][j].second = graph[i][k].second;
                }
            }
        }
    }
    return;
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    
    int n,m, a,b,t;
    cin >> n >> m;
    
    // μ΄ˆκΈ°ν™”
    vector<vector<ci>> graph(n+1, vector<ci>(n+1, {INF,0})); // graph[i][j] = {경둜크기, μ§€λ‚˜λŠ” μ§‘ν•˜μž₯}
    for(int i=1; i<=n; i++)
        graph[i][i] = {0, 0}; // iμ—μ„œ i둜 κ°ˆλ•ŒλŠ” 0μ‹œκ°„μ΄ 걸리고 μ§‘ν•˜μž₯을 μ§€λ‚˜μ§€ μ•ŠμŒ(0)
    
    // μž…λ ₯
    while(m--) {
        cin >> a >> b >> t;
        // aμ—μ„œ b둜 κ°ˆλ•Œ tμ‹œκ°„μ΄ 걸리고 μ§‘ν•˜μž₯ bλ₯Ό 지남
        graph[a][b] = {t, b};
        graph[b][a] = {t, a};
    }
    
    // μ—°μ‚°
    floydWarshall(n, graph);
    
    // 좜λ ₯
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=n; j++){
            if(graph[i][j].second == 0)
                cout << "- ";
            else
                cout << graph[i][j].second << " ";
        }
        cout << "\n";
    }
    
    return 0;
}

/*
 */
λ°˜μ‘ν˜•