結果
| 問題 |
No.971 いたずらっ子
|
| コンテスト | |
| ユーザー |
hitonanode
|
| 提出日時 | 2020-01-18 00:08:56 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 855 ms / 2,000 ms |
| コード長 | 2,065 bytes |
| コンパイル時間 | 1,346 ms |
| コンパイル使用メモリ | 97,980 KB |
| 実行使用メモリ | 73,728 KB |
| 最終ジャッジ日時 | 2024-11-07 11:35:51 |
| 合計ジャッジ時間 | 8,895 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 21 |
ソースコード
#include <iostream>
#include <string>
#include <vector>
int H, W;
std::vector<std::string> A;
using lint = long long int;
lint get_d(int x, int y) {
lint dd = 1 + (A[x][y] == 'k') * (x + y);
return dd;
}
#include <array>
#include <queue>
#include <tuple>
#include <utility>
#include <vector>
struct GridGraph
{
using T_E = lint;
const T_E INF = 1e18;
int H, W;
std::array<int, 2> dx = {1, 0};
std::array<int, 2> dy = {0, 1};
GridGraph() = default;
GridGraph(int h, int w) : H(h), W(w) {}
inline T_E edge_cost(int x_s, int y_s, int x_t, int y_t) {
return get_d(x_t, y_t);
}
// Dijkstra's algorithm
// Complexity: O(HWlog(HW))
std::vector<std::vector<T_E>> dij; // Distance from (x_s, y_s)
std::vector<std::vector<std::pair<int, int>>> dij_prv; // Previous node for Dijkstra optimal path
void dijkstra(int x_s, int y_s) {
dij.assign(H, std::vector<T_E>(W, INF));
dij_prv.assign(H, std::vector<std::pair<int, int>>(W, std::make_pair(-1, -1)));
using P = std::tuple<T_E, int, int>;
std::priority_queue<P, std::vector<P>, std::greater<P>> pq;
pq.emplace(0, x_s, y_s);
while (!pq.empty()) {
T_E dnow;
int x, y;
std::tie(dnow, x, y) = pq.top();
pq.pop();
if (dij[x][y] < dnow) continue;
for (size_t d = 0; d < dx.size(); d++) {
int xn = x + dx[d];
int yn = y + dy[d];
if (xn < 0 or yn < 0 or xn >= H or yn >= W) continue;
T_E dnxt = dnow + edge_cost(x, y, xn, yn);
if (dij[xn][yn] > dnxt) {
dij[xn][yn] = dnxt;
dij_prv[xn][yn] = std::make_pair(x, y);
pq.emplace(dnxt, xn, yn);
}
}
}
}
};
using namespace std;
int main()
{
cin >> H >> W;
A.resize(H);
for (int i = 0; i < H; i++) cin >> A[i];
GridGraph g(H, W);
g.dijkstra(0, 0);
cout << g.dij[H - 1][W - 1] << endl;
}
hitonanode