algorithm

BOJ 1504

rkawk 2022. 9. 15. 19:47
๋”๋ณด๊ธฐ

ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ ์„ฑ๊ณต

 

 

1 ์ดˆ 256 MB 55090 13810 9328 24.562%

๋ฌธ์ œ

๋ฐฉํ–ฅ์„ฑ์ด ์—†๋Š” ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์„ธ์ค€์ด๋Š” 1๋ฒˆ ์ •์ ์—์„œ N๋ฒˆ ์ •์ ์œผ๋กœ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋กœ ์ด๋™ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ๋˜ํ•œ ์„ธ์ค€์ด๋Š” ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด์„œ ์ด๋™ํ•˜๋Š” ํŠน์ •ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๊ณ  ์‹ถ์€๋ฐ, ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ์ž„์˜๋กœ ์ฃผ์–ด์ง„ ๋‘ ์ •์ ์€ ๋ฐ˜๋“œ์‹œ ํ†ต๊ณผํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์„ธ์ค€์ด๋Š” ํ•œ๋ฒˆ ์ด๋™ํ–ˆ๋˜ ์ •์ ์€ ๋ฌผ๋ก , ํ•œ๋ฒˆ ์ด๋™ํ–ˆ๋˜ ๊ฐ„์„ ๋„ ๋‹ค์‹œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์— ์ฃผ์˜ํ•˜๋ผ. 1๋ฒˆ ์ •์ ์—์„œ N๋ฒˆ ์ •์ ์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ์ฃผ์–ด์ง„ ๋‘ ์ •์ ์„ ๋ฐ˜๋“œ์‹œ ๊ฑฐ์น˜๋ฉด์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ N๊ณผ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (2 โ‰ค N โ‰ค 800, 0 โ‰ค E โ‰ค 200,000) ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ E๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ์„œ ์„ธ ๊ฐœ์˜ ์ •์ˆ˜ a, b, c๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, a๋ฒˆ ์ •์ ์—์„œ b๋ฒˆ ์ •์ ๊นŒ์ง€ ์–‘๋ฐฉํ–ฅ ๊ธธ์ด ์กด์žฌํ•˜๋ฉฐ, ๊ทธ ๊ฑฐ๋ฆฌ๊ฐ€ c๋ผ๋Š” ๋œป์ด๋‹ค. (1 โ‰ค c โ‰ค 1,000) ๋‹ค์Œ ์ค„์—๋Š” ๋ฐ˜๋“œ์‹œ ๊ฑฐ์ณ์•ผ ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์ •์  ๋ฒˆํ˜ธ v1๊ณผ v2๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (v1 โ‰  v2, v1 โ‰  N, v2 โ‰  1) ์ž„์˜์˜ ๋‘ ์ •์  u์™€ v์‚ฌ์ด์—๋Š” ๊ฐ„์„ ์ด ์ตœ๋Œ€ 1๊ฐœ ์กด์žฌํ•œ๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋‘ ๊ฐœ์˜ ์ •์ ์„ ์ง€๋‚˜๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ์˜ ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๊ฒฝ๋กœ๊ฐ€ ์—†์„ ๋•Œ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

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

4 6
1 2 3
2 3 3
3 4 1
1 3 5
2 4 5
1 4 4
2 3

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

7โ€‹

์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ฌธ์ œ์ด๋‹ค.

1 -> v1 -> v2 -> N, 1 -> v2 -> v1 -> N ์ค‘ ์ตœ์†Ÿ๊ฐ’์ด ๋‹ต์ด ๋œ๋‹ค๋Š” ๊ฒƒ์€ ๊ธˆ๋ฐฉ ์ดํ•ด๋˜๋Š”๋ฐ, ํ”Œ๋กœ์ด๋“œ๋กœ๋Š” ์™œ ๊ณ„์† ํ‹€๋ฆฌ๋Š”์ง€ ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๊ฐ„๋‹ค.

์ด๋™ํ–ˆ๋˜ ๊ฐ„์„ ์„ ๋‹ค์‹œ ์ง€๋‚˜๋Š” ๊ฒฝ์šฐ๋Š” case1์—์„œ๋Š” v2์—์„œ N์„ ๋ชป๊ฐ€๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•ด๋‹นํ•˜๋Š”๊ฒŒ ์•„๋‹Œ๊ฐ€, ๊ทธ๋ ‡๋‹ค๋ฉด ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ํ”Œ๋กœ์ด๋“œ ๊ฒฝ์šฐ์˜ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๊ฐ€ INF๊ฐ€ ๋˜๋ฏ€๋กœ INF์ผ ๊ฒฝ์šฐ์— ๋‹ค์‹œ ์ฒดํฌํ•ด์ค˜์„œ 1 -> v1 -> v2 -> v1 -> N์ด ๋˜๊ณ , ์ด ๊ฒฝ์šฐ๋Š” ๊ฒฐ๊ตญ  

1 -> v2 -> v1 -> N์ด ๋˜๋Š”๋ฐ , ์ด๋Ÿฌ๋ฉด ํ”Œ๋กœ์ด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋ ๊ฑฐ๊ฐ™์€๋ฐ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ 3๋ฒˆ๋Œ๋ ค์„œ ํ’€์—ˆ๋‹ค.

 

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#define INF 987654321
using namespace std;
int N, E, v1, v2, ans;
vector<vector<pair<int,int>>>graph(1000);

int dijstra(int start, int last){
    vector<int>dist(N+1, INF);
    priority_queue<pair<int,int>, vector<pair<int,int>>, greater<>> pq;
    dist[start] = 0;
    pq.push({0, start});
    while(!pq.empty()){
        int cur_dist = pq.top().first;
        int cur_node = pq.top().second;
        pq.pop();
        for(int i=0; i<graph[cur_node].size(); i++){
            int nxt_node = graph[cur_node][i].first;
            int nxt_dist = cur_dist + graph[cur_node][i].second;
            if(nxt_dist < dist[nxt_node]){
                dist[nxt_node] = nxt_dist;
                pq.push({nxt_dist, nxt_node});
            }
        }
    }
    // for(int i=1; i<=N; i++){
    //     cout<<dist[i]<<' ';
    // }
    return dist[last];
}

int main(){
    cin>>N>>E;
    for(int i=0; i<E; i++){
        int a, b, c;
        cin>>a>>b>>c;
        graph[a].push_back({b,c});
        graph[b].push_back({a,c});
    }
    cin>>v1>>v2;
    ans = min(dijstra(1,v1)+dijstra(v1,v2)+dijstra(v2,N),dijstra(1,v2)+dijstra(v1,v2)+dijstra(v1,N) );
    // cout<<dijstra(1,v2)<<' '<<dijstra(v1,v2)<<' '<<dijstra(v1,N)<<endl;
    if(ans >= INF || ans <= 0) cout<<-1;
    else cout<<ans;
}

 

 

 

'algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ 1967  (1) 2022.09.25
BOJ 1238  (0) 2022.09.17
BOJ 1753 (Dijkstra)  (0) 2022.09.15
programmers ์ˆœ์œ„  (0) 2022.08.14
BOJ 10986  (0) 2022.07.09