๐Ÿ•๏ธ ICPC Sinchon/Shortest Path

[BOJ G4][C++] ๋ฐฑ์ค€ 10282๋ฒˆ: ํ•ดํ‚น

์„ ๋‹ฌ 2022. 11. 1. 16:41
๋ฐ˜์‘ํ˜•

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

 

10282๋ฒˆ: ํ•ดํ‚น

์ตœํ‰์ตœ์•…์˜ ํ•ด์ปค yum3์ด ๋„คํŠธ์›Œํฌ ์‹œ์„ค์˜ ํ•œ ์ปดํ“จํ„ฐ๋ฅผ ํ•ดํ‚นํ–ˆ๋‹ค! ์ด์ œ ์„œ๋กœ์— ์˜์กดํ•˜๋Š” ์ปดํ“จํ„ฐ๋“ค์€ ์ ์ฐจ ํ•˜๋‚˜๋‘˜ ์ „์—ผ๋˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ์–ด๋–ค ์ปดํ“จํ„ฐ a๊ฐ€ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ b์— ์˜์กดํ•œ๋‹ค๋ฉด, b๊ฐ€ ๊ฐ์—ผ๋˜๋ฉด

www.acmicpc.net

 

๋ฌธ์ œ

์ตœํ‰์ตœ์•…์˜ ํ•ด์ปค yum3์ด ๋„คํŠธ์›Œํฌ ์‹œ์„ค์˜ ํ•œ ์ปดํ“จํ„ฐ๋ฅผ ํ•ดํ‚นํ–ˆ๋‹ค! ์ด์ œ ์„œ๋กœ์— ์˜์กดํ•˜๋Š” ์ปดํ“จํ„ฐ๋“ค์€ ์ ์ฐจ ํ•˜๋‚˜๋‘˜ ์ „์—ผ๋˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ์–ด๋–ค ์ปดํ“จํ„ฐ a๊ฐ€ ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ b์— ์˜์กดํ•œ๋‹ค๋ฉด, b๊ฐ€ ๊ฐ์—ผ๋˜๋ฉด ๊ทธ๋กœ๋ถ€ํ„ฐ ์ผ์ • ์‹œ๊ฐ„ ๋’ค a๋„ ๊ฐ์—ผ๋˜๊ณ  ๋งŒ๋‹ค. ์ด๋•Œ b๊ฐ€ a๋ฅผ ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, a๊ฐ€ ๊ฐ์—ผ๋˜๋”๋ผ๋„ b๋Š” ์•ˆ์ „ํ•˜๋‹ค.

์ตœํ‰์ตœ์•…์˜ ํ•ด์ปค yum3์ด ํ•ดํ‚นํ•œ ์ปดํ“จํ„ฐ ๋ฒˆํ˜ธ์™€ ๊ฐ ์˜์กด์„ฑ์ด ์ฃผ์–ด์งˆ ๋•Œ, ํ•ดํ‚น๋‹นํ•œ ์ปดํ“จํ„ฐ๊นŒ์ง€ ํฌํ•จํ•˜์—ฌ ์ด ๋ช‡ ๋Œ€์˜ ์ปดํ“จํ„ฐ๊ฐ€ ๊ฐ์—ผ๋˜๋ฉฐ ๊ทธ์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์–ผ๋งˆ์ธ์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 100๊ฐœ์ด๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

  • ์ฒซ์งธ ์ค„์— ์ปดํ“จํ„ฐ ๊ฐœ์ˆ˜ n, ์˜์กด์„ฑ ๊ฐœ์ˆ˜ d, ํ•ดํ‚น๋‹นํ•œ ์ปดํ“จํ„ฐ์˜ ๋ฒˆํ˜ธ c๊ฐ€ ์ฃผ์–ด์ง„๋‹ค(1 ≤ n ≤ 10,000, 1 ≤ d ≤ 100,000, 1 ≤ c ≤ n).
  • ์ด์–ด์„œ d๊ฐœ์˜ ์ค„์— ๊ฐ ์˜์กด์„ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ a, b, s๊ฐ€ ์ฃผ์–ด์ง„๋‹ค(1 ≤ a, b ≤ n, a ≠ b, 0 ≤ s ≤ 1,000). ์ด๋Š” ์ปดํ“จํ„ฐ a๊ฐ€ ์ปดํ“จํ„ฐ b๋ฅผ ์˜์กดํ•˜๋ฉฐ, ์ปดํ“จํ„ฐ b๊ฐ€ ๊ฐ์—ผ๋˜๋ฉด s์ดˆ ํ›„ ์ปดํ“จํ„ฐ a๋„ ๊ฐ์—ผ๋จ์„ ๋œปํ•œ๋‹ค.

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ ๊ฐ™์€ ์˜์กด์„ฑ (a, b)๊ฐ€ ๋‘ ๋ฒˆ ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ํ•œ ์ค„์— ๊ฑธ์ณ ์ด ๊ฐ์—ผ๋˜๋Š” ์ปดํ“จํ„ฐ ์ˆ˜, ๋งˆ์ง€๋ง‰ ์ปดํ“จํ„ฐ๊ฐ€ ๊ฐ์—ผ๋˜๊ธฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„์ง€์–ด ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ’€์ด

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

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

using namespace std;

typedef pair<int, int> ci;

const int INF = 100000000;

ci dijkstra(int start, int n, vector<vector<ci>>&graph) {
    vector<int> dist(n+1, INF); // dist[i]: i๋ฒˆ ์ปดํ“จํ„ฐ๊ฐ€ ๊ฐ์—ผ๋˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„
    priority_queue<ci, vector<ci>, greater<>> pq; // {์ •์ , ์‹œ์ž‘์ ๋ถ€ํ„ฐ๊ฑฐ๋ฆฌ}
    
    // ์‹œ์ž‘ ์ •์  ์ดˆ๊ธฐํ™”
    dist[start] = 0;
    pq.push({start, 0});
    
    while(!pq.empty()) {
        int node = pq.top().first;
        int weight = pq.top().second;
        pq.pop();
        
        if(weight > dist[node])
            continue;
        
        // ํƒ์ƒ‰ํ•˜๋ ค๋Š” ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค ํƒ์ƒ‰
        for(int i=0; i<graph[node].size(); i++) {
            int next_node = graph[node][i].first;
            int next_weight = weight + graph[node][i].second;
            
            if(next_weight < dist[next_node]) {
                dist[next_node] = next_weight;
                pq.push({next_node, next_weight});
            }
        }
    }
    
    // ๊ฐ์—ผ๋œ ์ปดํ“จํ„ฐ ์ˆ˜์™€ ์‹œ๊ฐ„ ๊ตฌํ•˜๊ธฐ
    int hacked=0, time=0;
    for(int i=0; i<n+1; i++) {
        if(dist[i] == INF)
            continue;
        
        hacked++;
        time = max(dist[i], time);
        // ๊ฐ์—ผ๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ปดํ“จํ„ฐ๊ฐ€ ๊ฐ์—ผ๋˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ INF๋ฅผ ์ œ์™ธํ•œ ์ตœ๋Œ“๊ฐ’
    }
    
    return {hacked, time};
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    
    int t, n,d,c, a,b,s;
    cin >> t;
    
    while(t--){
        cin >> n >> d >> c;
        vector<vector<ci>> graph(n+1); // graph[b]=[{a,s}]: ์ปดํ“จํ„ฐb๊ฐ€ ๊ฐ์—ผ๋˜๋ฉด s์ดˆ ํ›„ a๋„ ๊ฐ์—ผ
        for(int i=0; i<d; i++) {
            cin >> a >> b >> s;
            graph[b].push_back({a,s});
        }
        
        ci ans = dijkstra(c, n, graph);
        
        cout << ans.first << " " << ans.second << "\n";
    }
    
    return 0;
}

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