結果
問題 | No.1283 Extra Fee |
ユーザー | ok |
提出日時 | 2020-11-06 22:39:38 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 175 ms / 2,000 ms |
コード長 | 2,233 bytes |
コンパイル時間 | 1,397 ms |
コンパイル使用メモリ | 98,960 KB |
実行使用メモリ | 23,604 KB |
最終ジャッジ日時 | 2024-11-16 06:44:24 |
合計ジャッジ時間 | 4,839 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 30 |
ソースコード
#include<iostream> #include<string> #include<iomanip> #include<cmath> #include<vector> #include<algorithm> #include<utility> #include<queue> using namespace std; #define int long long #define endl "\n" constexpr long long INF = (long long)1e18; constexpr long long MOD = 1'000'000'007; struct fast_io { fast_io(){ std::cin.tie(nullptr); std::ios::sync_with_stdio(false); }; } fio; int N, M; vector<vector<int>> cost; struct Node{ int y, x, z, c; bool operator > (const Node &n) const { return c > n.c; } }; int dx[] = {0, 0, 1, -1}; int dy[] = {1, -1, 0, 0}; int dijkstra(){ priority_queue<Node, vector<Node>, greater<Node>> Q; vector<vector<vector<int>>> d(N, vector<vector<int>>(N, vector<int>(2, INF))); Q.push({0, 0, 0, 0}); d[0][0][0] = 0; while(Q.size()){ Node cur = Q.top(); Q.pop(); // cout<<cur.y<<" "<<cur.x<<" z = "<<cur.z<<endl; // cout<<d[cur.y][cur.x][cur.z]<<" [][] "<<cur.c<<endl; if(d[cur.y][cur.x][cur.z] < cur.c) continue; if(cur.y == N-1 && cur.x == N-1) { return cur.c; } // cout<<cur.y<<" "<<cur.x<<endl; for(int i = 0; i < 4; i++){ int y = dy[i] + cur.y, x = dx[i] + cur.x; if(y < 0 || y >= N || x < 0 || x >= N) continue; if(cur.z == 0) { if(cur.c + 1 < d[y][x][cur.z+1]) { d[y][x][cur.z+1] = cur.c + 1; Q.push({y, x, cur.z + 1, cur.c + 1}); } } // cout<<"i = "<<i<<endl; if(cur.c + 1 + cost[y][x] < d[y][x][cur.z]) { d[y][x][cur.z] = cur.c + 1 + cost[y][x]; // cout<<"<>"<<" y = "<<y<<" x = "<<x<<" "<<d[y][x][cur.z]<<endl; Q.push({y, x, cur.z, d[y][x][cur.z]}); } } } return -1; } signed main(){ cout<<fixed<<setprecision(10); cin>>N>>M; cost.resize(N, vector<int>(N)); for(int i = 0; i < M; i++){ int h, w, c; cin>>h>>w>>c; h--, w--; cost[h][w] = c; } cout<<dijkstra()<<endl; return 0; }