๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1753 ์ตœ๋‹จ ๊ฒฝ๋กœ dijkstra

by Jouureee 2021. 3. 10.

๋ฌธ์ œ :

www.acmicpc.net/problem/1753

 

1753๋ฒˆ: ์ตœ๋‹จ๊ฒฝ๋กœ

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ V์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1≤V≤20,000, 1≤E≤300,000) ๋ชจ๋“  ์ •์ ์—๋Š” 1๋ถ€ํ„ฐ V๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์‹œ์ž‘ ์ •์ ์˜ ๋ฒˆํ˜ธ K(1≤K≤V)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

 

๋ถ„์„ :

๋Œ€ํ‘œ์ ์ธ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์ด๋‹ค. 

๋‹ค์ต์ŠคํŠธ๋ผ์˜ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐฐ์—ด ๋˜๋Š” ์šฐ์„ ์ˆœ์œ„ ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฐฐ์—ด๋กœ ์‚ฌ์šฉ ํ•  ์‹œ ์‹œ์ž‘ ๋…ธ๋“œ์™€ ๋๋‚˜๋Š” ๋…ธ๋“œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋„ฃ๊ธฐ ์œ„ํ•ด 

int v[in][to] = w ์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ

๋ฌธ์ œ์˜ ๋ฐฐ์—ด์˜ ๋ฒ”์œ„๊ฐ€ 20000์ด๋ผ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚˜ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅ ํ–ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•ด for๋ฌธ์„ ๋Œ๋ฉด์„œ ๋˜ ๋‹ค์‹œ for๋ฌธ์„ ๋Œ์•„ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(V(vertex) ^2)์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.

 

ํ•˜์ง€๋งŒ ์šฐ์„  ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ๋ฐ”๋กœ pop ์‹œ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ํฐ (์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์ž‘์€ ๋…ธ๋“œ์ด๋ฏ€๋กœ - ๋ถ™์—ฌ์ค€๋‹ค)

๋…ธ๋“œ๋ฅผ ๋ฐ”๋กœ ์ฐพ์•„์ฃผ๊ธฐ ๋•Œ๋ฌธ์— O(E(edge))์‹œ๊ฐ„ ๋งŒํผ๋งŒ ๊ฑธ๋ฆฐ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. (๋ชจ๋“  edge๋ฅผ ํ•œ๋ฒˆ์”ฉ ๋ˆ๋‹ค ..!)

๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ๋“ค์˜ ๋„์›€์„ ๋ฐ›์•„ ์šฐ์„  ์ˆœ์œ„ ํ๋ฅผ ํ™œ์šฉํ•ด ๊ฑฐ๋ฆฌ๊ฐ€ ์ž‘์€ ๋…ธ๋“œ๋ถ€ํ„ฐ ๊บผ๋‚ด ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•ด ์ฃผ์—ˆ๋‹ค. 

 

 

c++ ์ฝ”๋“œ :

//
//  1753_min_path.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2021/03/09.
//

#include <stdio.h>
#include <iostream>
#include <vector>
#include <queue>

using namespace std;
#define INF 1e9

vector<pair<int, int>> vertex[100001];
int d[100001]; // ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”

void find_min_path(int start){
    priority_queue<pair<int, int>>pq;
    //๊ฑฐ๋ฆฌ, ๊นŒ์ง€ ์ •์ 
    pq.push(make_pair(0, start));
    d[start] = 0;
    
    while(!pq.empty()){
        //์šฐ์„  ์ˆœ์œ„ ํ๋Š” ๊ฐ€์žฅ ํฐ ์›์†Œ top์œผ๋กœ ๋†“์œผ๋ฏ€๋กœ
        //๊ฑฐ๋ฆฌ ์ž‘์€ ์ •์ ๋ถ€ํ„ฐ ๊บผ๋‚ด์ง€๋„๋ก ํ•˜๊ธฐ
        int dist = -pq.top().first;
        int now = pq.top().second;
        pq.pop();
        
        for(int i = 0; i < vertex[now].size(); i++){
            //๊ฑฐ์ณ์„œ ๊ฐ€๋Š” ๋…ธ๋“œ์˜ ๋น„์šฉ์„ ๊ณ„์‚ฐ
            int cost = dist + vertex[now][i].second;
            if(cost <d[vertex[now][i].first]) // ๋น„์šฉ์ด ๋” ์ž‘๋‹ค๋ฉด ์ตœ๋‹จ๊ฒฝ๋กœ ํ…Œ์ด๋ธ” ๊ฐ’์„ ๊ฐฑ์‹ .
            {
                d[vertex[now][i].first] = cost;
                pq.push(make_pair(-cost,vertex[now][i].first));
            }
        }
    }
}

int main(){
    int v, e;
    cin >> v >> e;
    int start;
    cin >> start;
    
    for(int i =0; i < e; i++){
        int in, to, w;
        cin >> in >> to >> w;
        vertex[in].push_back({to, w});
    }
    fill(d, d+100001, INF);
    find_min_path(start);
    
    // ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
    for (int i = 1; i <= v; i++)
    {
        // ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
        if (d[i] == INF) {
            cout << "INF" << '\n';
        }
        // ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
        else {
            cout << d[i] << '\n';
        }
    }

    return 0;
}

๋Œ“๊ธ€