#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll dist[505][505], dp[505][505][6], vis[505][505][6];
ll H, W, N, px[100005], py[100005];
ll A, B, C;
queue<pair<ll,ll>> q;
priority_queue<tuple<ll,ll,ll,ll>, vector<tuple<ll,ll,ll,ll>>, greater<tuple<ll,ll,ll,ll>>> pq;
ll xx[] = {0, -1, 0, 1};
ll yy[] = {1, 0, -1, 0};
int main() {
ios_base::sync_with_stdio(0), cin.tie(0);
cin >> H >> W >> A >> B >> C >> N;
H++, W++;
for (int i = 0; i < 505; i++) for (int j = 0; j < 505; j++) dist[i][j] = 1e18;
for (int i = 0; i < 505; i++) for (int j = 0; j < 505; j++) for (int k = 0; k < 6; k++) dp[i][j][k] = 1e18;
for (int i = 1; i <= N; i++) {
cin >> py[i] >> px[i];
px[i]++, py[i]++;
q.emplace(py[i], px[i]);
dist[py[i]][px[i]] = 0;
}
while (!q.empty()) {
auto [y, x] = q.front();
q.pop();
for (int i = 0; i < 4; i++) {
int ny = y + yy[i], nx = x + xx[i];
if (ny < 1 || ny > H || nx < 1 || nx > W) continue;
if (dist[ny][nx] <= dist[y][x] + C) continue;
dist[ny][nx] = dist[y][x] + C;
q.emplace(ny, nx);
}
}
dp[py[1]][px[1]][4] = 0;
pq.emplace(0, py[1], px[1], 4);
while (!pq.empty()) {
auto [w, y, x, st] = pq.top();
pq.pop();
//cout << w << " " << y << " " << x << " " << st << endl;
if (vis[y][x][st]) continue;
vis[y][x][st] = 1;
if (st < 4) {
if (dp[y][x][4] > w) {
dp[y][x][4] = w;
pq.emplace(w, y, x, 4);
}
int ny = y + yy[st], nx = x + xx[st];
if (ny >= 1 && ny <= H && nx >= 1 && nx <= W && dp[ny][nx][st] > w + A) {
dp[ny][nx][st] = w + A;
pq.emplace(w + A, ny, nx, st);
}
}
if (st == 4) {
if (dp[y][x][5] > w + dist[y][x]) {
dp[y][x][5] = w + dist[y][x];
pq.emplace(dp[y][x][5], y, x, 5);
}
}
if (st == 5) {
for (int i = 0; i < 4; i++) {
int ny = y + yy[i], nx = x + xx[i];
if (ny < 1 || ny > H || nx < 1 || nx > W) continue;
if (dp[ny][nx][i] <= w + A + B) continue;
dp[ny][nx][i] = w + A + B;
pq.emplace(dp[ny][nx][i], ny, nx, i);
}
for (int i = 0; i < 4; i++) {
int ny = y + yy[i], nx = x + xx[i];
if (ny < 1 || ny > H || nx < 1 || nx > W) continue;
if (dp[ny][nx][5] <= w + C) continue;
dp[ny][nx][5] = w + C;
pq.emplace(dp[ny][nx][5], ny, nx, 5);
}
}
}
cout << min(dp[py[N]][px[N]][4], dp[py[N]][px[N]][5]);
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |