문제: icpc.me/13308
1->n까지의 최소 비용을 원하는 문제이므로 다익스트라로 해결해줄 수 있다.
다만 문제에서 비용과 거리가 동시에 존재하므로 현재 보는 경로상에서 정점 x까지 순회하는 동안 발견한 가장 저렴한 주유소의 주유가격을 저장하여 d[here][mincost]로 2차원 테이블을 잡아 문제를 해결해주어야 한다.
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 | #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <cstring> using namespace std; typedef long long ll; vector<vector<pair<ll, ll>>> vt; ll n, m, l[2550], x, y, z, d[2550][2550], r; int main() { scanf("%lld%lld", &n, &m); for (int i = 1; i <= n; i++) scanf("%lld", &l[i]); vt.resize(n + 1); for (int i = 0; i < m; i++) { scanf("%lld%lld%lld", &x, &y, &z); vt[x].push_back({ y,z }); vt[y].push_back({ x,z }); } memset(d, -1, sizeof(d)); priority_queue<pair<ll, pair<ll,ll>>> pq; pq.push({ 0,{1,l[1]} }); while (pq.size()) { ll here = pq.top().second.first; ll cost = -pq.top().first; ll minl = pq.top().second.second; pq.pop(); if (d[here][minl] != -1)continue; d[here][minl] = cost; if (here == n) { r = cost; break; } for (auto next : vt[here]) { if (d[next.first][min(minl,l[next.first])] != -1)continue; pq.push({ -cost - next.second*minl,{next.first,min(minl,l[next.first])} }); } } printf("%lld\n", r); return 0; } | cs |
'알고리즘 관련 > BOJ' 카테고리의 다른 글
BOJ)12961 체스판2 (0) | 2017.05.17 |
---|---|
BOJ)3654 L퍼즐 (0) | 2017.05.17 |
BOJ)9460 메탈 (0) | 2017.04.29 |
BOJ)3683 고양이와 개 (0) | 2017.04.27 |
BOJ)2610 회의준비 (0) | 2017.04.24 |