[c++] BOJ 1916 :: ์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ

๋‚œ์ด๋„ : ๊ณจ๋“œ 5

๊ฑธ๋ฆฐ ์‹œ๊ฐ„ : 30๋ถ„

 

๋ฌธ์ œ

์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ ๋ฌธ์ œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

N๊ฐœ์˜ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋„์‹œ์— ๋„์ฐฉํ•˜๋Š” M๊ฐœ์˜ ๋ฒ„์Šค๊ฐ€ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” A๋ฒˆ์งธ ๋„์‹œ์—์„œ B๋ฒˆ์งธ ๋„์‹œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ๋ฒ„์Šค ๋น„์šฉ์„ ์ตœ์†Œํ™” ์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. A๋ฒˆ์งธ ๋„์‹œ์—์„œ B๋ฒˆ์งธ ๋„์‹œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ์ตœ์†Œ๋น„์šฉ์„ ์ถœ๋ ฅํ•˜์—ฌ๋ผ. ๋„์‹œ์˜ ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€์ด๋‹ค.

 

ํ’€์ด

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int main() {
    // ์ตœ์†Œ๋น„์šฉ ๋ฌธ์ œ => bfs / ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰(๋‹ค์ต์ŠคํŠธ๋ผ)
    // N 10^3์ดํ•˜ M 10^6 ์ดํ•˜
    // ์ถœ๋ฐœ, ๋„์ฐฉ, ๋น„์šฉ
    // ๋น„์šฉ 10^6 ์ดํ•˜
    // ๋งˆ์ง€๋ง‰ (์ถœ๋ฐœ, ๋„์ฐฉ)

    // ๋‹ค์ต์ŠคํŠธ๋ผ๋กœ ํ’€๋ฉด,
    // ์ถœ๋ฐœ => (๋น„์šฉ, ๋„์ฐฉ) priority_queue์— ์ €์žฅ
    // ์ตœ์†Œ ๊ฐ„์„  ํ•˜๋‚˜์”ฉ ๋นผ๋ฉด์„œ ๊ฐฑ์‹ 

    // ์ž…๋ ฅ
    int N; int M;
    cin >> N >> M;

    vector<vector<pair<int, int>>> bus(N + 1); // ๋น„์šฉ, ๋„์ฐฉ ์ €์žฅ
    vector<int> memo(N + 1, 1e9);
    for (int i = 0; i < M; i++) {
        int s, e, v;
        cin >> s >> e >> v;
        bus[s].push_back(make_pair(v, e));
    }

    int start; int target;
    cin >> start >> target;

    priority_queue<pair<int, int>> que;
    que.push(make_pair(0, start));

    while (!que.empty()) {
        pair<int,int> tmp = que.top();
        int v = -tmp.first; int e = tmp.second;
        que.pop();
        if (v > memo[e]) // ํ˜„์žฌ value๊ฐ€ memo[e] ๋ณด๋‹ค ํฌ๋‹ค๋ฉด ์ด๋ฏธ ์ตœ์†Œ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹  ๋œ ๊ณณ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•  ํ•„์š” ์—†์Œ
            continue;

        for (int i = 0; i < bus[e].size(); i++) {
            pair<int, int> tmp2 = bus[e][i];
            int value = tmp2.first; int end = tmp2.second;
            if (value + v < memo[end]) {
                memo[end] = value + v;
                que.push(make_pair(-memo[end], end));
            }
        }
    }

    cout << memo[target] << endl;
}

 

๊ฒฐ๊ณผ

 

์ƒ๊ฐํ•ด๋ณผ ๊ฒƒ

  • ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์‹œ์ž‘์ ์—์„œ ๋ชจ๋“  ์ ๊นŒ์ง€์˜ ์ตœ์†Œ ๋น„์šฉ์„ ๊ณ„์‚ฐํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”์—†๋Š” ์ •๋ณด๋„ ๋“ค์–ด์žˆ๋‹ค.
  • ๋‹ค์–‘ํ•œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์ธก์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • BFS : ๊ฐ€์ค‘์น˜๊ฐ€ ์—†์„ ๊ฒฝ์šฐ(์ฃผ๋กœ), 1:N
      • ํ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒดํฌํ•˜๋ฉด์„œ ๋…ธ๋“œ์˜ ๊ฐ€์ค‘์น˜ ๊ฐฑ์‹ 
      • O(V+E)
    • ๋‹ค์ต์ŠคํŠธ๋ผ : ๊ฐ€์ค‘์น˜๊ฐ€ ์–‘์ˆ˜์ธ ๊ฒฝ์šฐ, 1:N
      • ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ€์ค‘์น˜๊ฐ€ ๋‚ฎ์€ ๊ฐ„์„ ๋ถ€ํ„ฐ ์ฒดํฌํ•˜๋ฉด์„œ ๋…ธ๋“œ์˜ ๊ฐ€์ค‘์น˜ ๊ฐฑ์‹ 
      • ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์Œ์ˆ˜์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ€์ง„ cycle์—์„œ ์Œ์˜ ๋ฌดํ•œ๋Œ€๋กœ ๋ฐœ์‚ฐํ•˜๋ฏ€๋กœ ์ตœ์†Œ๊ฐ’์„ ์ •ํ•  ์ˆ˜ ์—†์Œ
        • queue๋ฅผ ํ†ตํ•ด ๋ฌดํ•œ๋Œ€๋กœ ๋ฃจํ”„๊ฐ€ ๋Œ์•„๊ฐ
        • ๋ฐ˜๋ฉด ๋ฒจ๋งŒ-ํฌ๋“œ๋Š” ์ •ํ•ด์ง„ ํšŸ์ˆ˜๋งŒ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌดํ•œ๋Œ€ x
      • O(ElogE)

S๋ถ€ํ„ฐ E๊นŒ์ง€์˜ ์ตœ์†Œ ๊ฒฝ๋กœ๋Š” ์Œ์˜ ๋ฌดํ•œ๋Œ€๋กœ ๋ฐœ์‚ฐํ•จ

    • ๋ฒจ๋งŒ-ํฌ๋“œ : ๊ฐ€์ค‘์น˜๊ฐ€ ์Œ์ˆ˜์ธ ๊ฒฝ์šฐ๋„ ๊ฐ€๋Šฅ, 1:N
      • ๋ชจ๋“  ์—ฃ์ง€๋ฅผ ๋Œ๋ฉด์„œ ๋…ธ๋“œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ๊ณผ์ •์„ ๋ชจ๋“  ์—ฃ์ง€์˜ ๊ฐฏ์ˆ˜๋งŒํผ ์ˆ˜ํ–‰ => ์•„์ง ๊ฐ€์ค‘์น˜๊ฐ€ ์ดˆ๊ธฐ๊ฐ’์ผ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ (์ดˆ๊ธฐ๊ฐ’์ด๋ฉด ๋กœ์ง ์ˆ˜ํ–‰ x)
      • ๋‹ค์ต์ŠคํŠธ๋ผ๋ณด๋‹ค ๋Š๋ฆผ O(VE)
    • Shortest Path Faster Algorithm (SPFA) : ๋ฒจ๋งŒํฌ๋“œ ํ–ฅ์ƒ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ : N:N
      • dk(i,j)=min(dk−1(i,j),dk−1(i,k)+dk−1(k,j))
      • O(V^3)

 

์ฐธ๊ณ  : https://shnoh.tistory.com/15

https://www.crocus.co.kr/1089

๋ฐ˜์‘ํ˜•