๐Ÿ•๏ธ 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;
}

/*
 */
๋ฐ˜์‘ํ˜•