tony9402

[백준 1504] 특정한 최단 경로 본문

알고리즘/Baekjoon Online Judge

[백준 1504] 특정한 최단 경로

ssu_gongdoli 2018. 8. 31. 20:27
반응형

백준 1504 특정한 최단 경로



우선순위 큐를 이용한 다익스트라 공부중.....(소스가 좀 드러울 수도 있음)

(지금은 소스만 올리고 나중에 정리해서 수정할 예정)





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
 
using namespace std;
 
const long long INF = 98765432;
 
vector<vector<pair<intint>>> map;
priority_queue<pair<intint>> pq;
vector<long long> ans;
int v, e;
 
long long Daijk(int start, int end)
{
    ans.clear();
    ans.resize(v + 1);
    fill(ans.begin(), ans.end(), INF);
 
    pq.push(make_pair(0, start));
    ans[start] = 0;
 
    while (!pq.empty())
    {
        pair<intint> now = pq.top(); pq.pop();
        int cost = -now.first;
        int here = now.second;
 
        for (int i = 0; i < map[here].size(); i++)
        {
            int next = map[here][i].first;
            int next_cost = map[here][i].second;
 
            if (ans[next] > ans[here] + next_cost)
            {
                ans[next] = ans[here] + next_cost;
                pq.push(make_pair(-next_cost, next));
            }
        }
    }
    
    return ans[end];
}
 
int main()
{
 
    scanf("%d %d"&v, &e);
    map.resize(v + 1);
 
    int from, to, cost;
    for (int i = 0; i < e; i++)
    {
        scanf("%d %d %d"&from, &to, &cost);
        map[from].push_back(make_pair(to, cost));
        map[to].push_back(make_pair(from, cost));
    }
    int start, end;
    scanf("%d %d"&start, &end);
 
    long long out1 = Daijk(1, start);
    long long out2 = Daijk(end, v);
    long long out3 = Daijk(1end);
    long long out4 = Daijk(start, v);
    long long mid = Daijk(end, start);
 
    long long ans1, ans2;
    ans1 = out1 + out2;
    ans2 = out3 + out4;
 
    if (mid == INF || (ans1 >= INF && ans2 >= INF))return !printf("-1");
    return !printf("%d", (ans1 > ans2 ? ans2 : ans1) + mid);
}
cs


반응형

'알고리즘 > Baekjoon Online Judge' 카테고리의 다른 글

[백준 1182] 부분집합의 합  (0) 2018.10.20
[백준 11657] 타임머신  (0) 2018.08.31
[백준 1753] 최단경로  (0) 2018.08.31
[백준 1916] 최소비용 구하기  (0) 2018.08.31
[백준 7569] 토마토(3차원)  (0) 2018.08.23
Comments