algorithm

BOJ 11779

rkawk 2022. 9. 28. 19:00
๋”๋ณด๊ธฐ

์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ 2 ์„ฑ๊ณต์ŠคํŽ˜์…œ ์ €์ง€

 
1 ์ดˆ 256 MB 18841 6855 4782 36.407%

๋ฌธ์ œ

n(1≤n≤1,000)๊ฐœ์˜ ๋„์‹œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ ๋„์‹œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋„์‹œ์— ๋„์ฐฉํ•˜๋Š” m(1≤m≤100,000)๊ฐœ์˜ ๋ฒ„์Šค๊ฐ€ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” A๋ฒˆ์งธ ๋„์‹œ์—์„œ B๋ฒˆ์งธ ๋„์‹œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ๋ฒ„์Šค ๋น„์šฉ์„ ์ตœ์†Œํ™” ์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด A๋ฒˆ์งธ ๋„์‹œ์—์„œ B๋ฒˆ์งธ ๋„์‹œ ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ์ตœ์†Œ๋น„์šฉ๊ณผ ๊ฒฝ๋กœ๋ฅผ ์ถœ๋ ฅํ•˜์—ฌ๋ผ. ํ•ญ์ƒ ์‹œ์ž‘์ ์—์„œ ๋„์ฐฉ์ ์œผ๋กœ์˜ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ n(1≤n≤1,000)์ด ์ฃผ์–ด์ง€๊ณ  ๋‘˜์งธ ์ค„์—๋Š” ๋ฒ„์Šค์˜ ๊ฐœ์ˆ˜ m(1≤m≤100,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์…‹์งธ ์ค„๋ถ€ํ„ฐ m+2์ค„๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒ„์Šค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋จผ์ € ์ฒ˜์Œ์—๋Š” ๊ทธ ๋ฒ„์Šค์˜ ์ถœ๋ฐœ ๋„์‹œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‹ค์Œ์—๋Š” ๋„์ฐฉ์ง€์˜ ๋„์‹œ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง€๊ณ  ๋˜ ๊ทธ ๋ฒ„์Šค ๋น„์šฉ์ด ์ฃผ์–ด์ง„๋‹ค. ๋ฒ„์Šค ๋น„์šฉ์€ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100,000๋ณด๋‹ค ์ž‘์€ ์ •์ˆ˜์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  m+3์งธ ์ค„์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ตฌํ•˜๊ณ ์ž ํ•˜๋Š” ๊ตฌ๊ฐ„ ์ถœ๋ฐœ์ ์˜ ๋„์‹œ๋ฒˆํ˜ธ์™€ ๋„์ฐฉ์ ์˜ ๋„์‹œ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ถœ๋ฐœ ๋„์‹œ์—์„œ ๋„์ฐฉ ๋„์‹œ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๋“œ๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋‘˜์งธ ์ค„์—๋Š” ๊ทธ๋Ÿฌํ•œ ์ตœ์†Œ ๋น„์šฉ์„ ๊ฐ–๋Š” ๊ฒฝ๋กœ์— ํฌํ•จ๋˜์–ด์žˆ๋Š” ๋„์‹œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ถœ๋ฐœ ๋„์‹œ์™€ ๋„์ฐฉ ๋„์‹œ๋„ ํฌํ•จํ•œ๋‹ค.

์…‹์งธ ์ค„์—๋Š” ์ตœ์†Œ ๋น„์šฉ์„ ๊ฐ–๋Š” ๊ฒฝ๋กœ๋ฅผ ๋ฐฉ๋ฌธํ•˜๋Š” ๋„์‹œ ์ˆœ์„œ๋Œ€๋กœ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ 1 ๋ณต์‚ฌ

5
8
1 2 2
1 3 3
1 4 1
1 5 10
2 4 2
3 4 1
3 5 1
4 5 3
1 5

์˜ˆ์ œ ์ถœ๋ ฅ 1 ๋ณต์‚ฌ

4
3
1 3 5โ€‹

๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฌธ์ œ์—์„œ ํ•œ ์ธต ๋‚˜์•„๊ฐ€ ๊ฒฝ๋กœ๋ฅผ ์ฐ์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๊ฒฝ๋กœ ์ฐ๋Š”๊ฑฐ ๋•Œ๋ฌธ์— ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ค์› ๋‹ค.

 

๊ฒฝ๋กœ๋Š” intํ˜• ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด์ฃผ์–ด, ๋‹ค์ต์ŠคํŠธ๋ผ๋กœ ๋‹ค์Œ ๋…ธ๋“œ์— ๋น„์šฉ์„ ์ €์žฅํ•ด์ค„๋•Œ ๊ฒฝ๋กœ[๋‹ค์Œ๋…ธ๋“œ] = ํ˜„์žฌ๋…ธ๋“œ ๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์–ด์ฒ˜ํ”ผ ๋‹ค์ต์ŠคํŠธ๋ผ๋Š” ์ •ํ•ด์ง„ ์ถœ๋ฐœ์ ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ€๊ธฐ๋•Œ๋ฌธ์—, ์ด๋ ‡๊ฒŒ๋งŒ ์ฐ์–ด์ค˜๋„ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•œ๊ฑธ ์™œ ์• ๋จน์—ˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. 

 

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define INF 987654321
using namespace std;

int N, M, A, B;
vector<vector<pair<int,int>>>graph(1001);

int main(){
    cin>>N>>M;
    for(int i=0; i<M; i++){
        int st, dest, cost;
        cin>>st>>dest>>cost;
        graph[st].push_back({cost,dest});
    }
    cin>>A>>B;
    for(int i=1; i<=N; i++)
        sort(graph[i].begin(), graph[i].end());
    vector<int>dist(1001, INF);
    int visit[1001] = {0};
    dist[A] = 0;
    priority_queue<pair<int,int>, vector<pair<int,int>>, greater<>>pq;
    pq.push({0, A});
    while(!pq.empty()){
        int cur_node = pq.top().second;
        int cur_dist = pq.top().first;
        pq.pop();
        for(auto edge : graph[cur_node]){
            int nxt_node = edge.second;
            int nxt_dist = edge.first + cur_dist;
            if(nxt_dist < dist[nxt_node]){
                visit[nxt_node] = cur_node;
                dist[nxt_node] = nxt_dist;
                pq.push({nxt_dist, nxt_node});
            }
        }
    }
    vector<int>v;
    int t = B;
    while(t){
        v.push_back(t);
        t = visit[t];
    }
    cout<<dist[B]<<'\n'<<v.size()<<'\n';
    while(!v.empty()){
        cout<<v.back()<<' ';
        v.pop_back();
    }
        


}