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