๋ฌธ์ ๋งํฌ
13308๋ฒ: ์ฃผ์ ์ (acmicpc.net)
DP์ ๊ทธ๋ํํ์ ์ค ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ด ๊ฒฐํฉ๋ ๋ฌธ์ .
์ฌ์ค DP๋ณด๋ค๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๊น์ด ๊ฒ๊ฐ๋ค.
ํ์ด
์ฒ์์ ์๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ฒ๋ผ dist๋ผ๋ 1์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ ์ต์๋น์ฉ์ ์ ์ฅํ๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ๋๋ฉด ์์ ์ฒ๋ผ
์ด๋ฌํ ์ํฉ์์ dist[3] ์๋ 1->3 ๊ฒฝ๋ก๋ก ์ธํด 15๊ฐ ์ ์ฅ๋์ด์๊ณ , 1 -> 2 -> 3 -> 4 ๋ก ๊ฐ๋ ๋ฃจํธ๊ฐ ์ต์๋น์ฉ์ผ๋ก 4์ ๋๋ฌํ๋ ๊ฒฝ๋ก์ด์ง๋ง 1 ->2-> 3 ๊ฒฝ๋ก๋ก 3์ ๋๋ฌํ๊ฒ ๋๋ฉด 16์ ๋น์ฉ์ด ๋๋๋ฐ ๊ธฐ์กด์ ์ ์ฅ๋ ๊ฐ๋ณด๋ค ํฌ๊ธฐ๋๋ฌธ์ ํ์์ ๋ฉ์ถ๊ฒ ๋๋ค.
๊ทธ๋์ ๋จ์ง ๊ทธ ์ง์ ์ ๋์ฐฉํ์ ๋ ์ต์๋น์ฉ๋ง ๋น๊ตํ๋ ๊ฒ์ด ์๋๋ผ ๊ธฐ๋ฆ์ ๊ฐ๋ ๊ฐ์ด ๋น๊ต๋ฅผ ํด์ ํ์์ ๊ณ์ํ ๊ฒ์ธ์ง ์ค๋จํ ๊ฒ์ธ์ง ํ๋จํด์ผํ๋ค.
dist ๋ฐฐ์ด์ 2์ฐจ์์ผ๋ก ๋ง๋ค์ด์ dist[ํ์ฌ ๋ ธ๋][ํ์ฌ ๊ธฐ๋ฆ ๊ฐ] ์ผ๋ก ๋ง๋ค์ด์ ์ด ๋น์ฉ๊ณผ ๊ธฐ๋ฆ๊ฐ ๋ ๊ฐ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ํจ์จ์ ์ธ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ค.
๋ง์ฝ ์๋ก์ด ๊ฒฝ๋ก์ ์ด ๋น์ฉ์ด ๊ธฐ์กด ํ์๋ ๊ฒฝ๋ก๋ณด๋ค ๋ง์๋ ํ์ฌ ๊ธฐ๋ฆ๊ฐ์ด ๊ธฐ์กด ๊ฒฝ๋ก๋ณด๋ค ์๋ค๋ฉด ๋ฉ๋ฆฌ๋ดค์ ๋๋ ๋ ํจ์จ์ ์ธ ๊ฒฝ๋ก๊ฐ ๋ ์ ์๋ค๋ ๊ฒ์ด๋ค.
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
|
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 1000000007
using namespace std;
typedef long long ll;
typedef priority_queue<pair<pair<ll, int>, int>, vector<pair<pair<ll, int>, int>>, greater<pair<pair<ll, int>, int>>> Priority_queue;
const ll INF = LLONG_MAX;
const int MAX_N = 2500 + 5;
int oil_price[MAX_N];
int N, M;
vector<pair<int, int>> Edge[MAX_N];
ll dist[MAX_N][MAX_N];
void dijkstra(int st, int ed);
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> M;
for (int i = 1; i <= N; i++) {
cin >> oil_price[i];
}
for (int i = 0; i < M; i++) {
int u, v, w;
cin >> u >> v >> w;
Edge[u].push_back({ v,w });
Edge[v].push_back({ u,w });
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= 2500; j++)
dist[i][j] = INF;
}
dijkstra(1, N);
return 0;
}
void dijkstra(int st, int ed) {
//ํ์ ํ์ฌ์ , ์ฌํ ์ง๋์จ ์ ์ค์ ๊ธฐ๋ฆ์ด ๊ฐ์ฅ ์๋๊ณณ, ๋น์ฉ ์ด ๋ค์ด์์ด์ผํจ
Priority_queue pq;
pq.push({ {0,st},oil_price[1] });
while (!pq.empty()) {
ll cost = pq.top().first.first;
int now = pq.top().first.second;
int price = pq.top().second;
pq.pop();
if (dist[now][price] < cost)
continue;
if (now == ed) {
cout << cost << "\n";
return;
}
for (int i = 0; i < Edge[now].size(); i++) {
int next = Edge[now][i].first;
int distance = Edge[now][i].second;
ll acost = cost + (distance * price);
if (dist[next][price] <= acost)
continue;
int min_price = min(price, oil_price[next]);
dist[next][price] = acost;
pq.push({ { acost,next }, min_price});
}
}
}
|
cs |
'๋ฐฑ์ค > Platinum' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 10251 : ์ด์ ๋ฉดํ ์ํ (0) | 2022.03.25 |
---|---|
[BOJ] 1028 : ๋ค์ด์๋ชฌ๋ ๊ด์ฐ (0) | 2022.03.23 |
[BOJ] 10272 : ํ์๊ธ ์ฌ๋ฅ๊พผ ๊น์ ์ (0) | 2022.03.11 |
[BOJ] 2842 : ์ง๋ฐฐ์ ํ์๋ (0) | 2022.03.10 |
[BOJ] 3197 : ๋ฐฑ์กฐ์ ํธ์ (0) | 2022.03.08 |