Notice
Recent Posts
Recent Comments
tony9402
[백준 1504] 특정한 최단 경로 본문
반응형
백준 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<int, int>>> map; priority_queue<pair<int, int>> 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<int, int> 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(1, end); 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