結果
| 問題 |
No.1 道のショートカット
|
| コンテスト | |
| ユーザー |
ふーらくたる
|
| 提出日時 | 2016-06-24 02:20:59 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 5,000 ms |
| コード長 | 1,977 bytes |
| コンパイル時間 | 634 ms |
| コンパイル使用メモリ | 69,796 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-20 16:23:56 |
| 合計ジャッジ時間 | 1,865 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 40 |
ソースコード
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
struct Edge {
int to, money, time;
};
// priority_queueで使うための状態. 時間が小さい方から出てくる.
struct State {
int city, money, time;
bool operator>(const State& s) const {
return time > s.time;
}
};
const int kINF = 1 << 28;
const int kMAX_V = 60;
const int kMAX_C = 310;
const int kMAX_E = 1510;
vector<Edge> graph[kMAX_V];
int C, V, E;
int S[kMAX_E], T[kMAX_E], Y[kMAX_E], M[kMAX_E]; // 始点, 終点, コスト, 時間
int cost[kMAX_V][kMAX_C]; // (都市, 使った料金)
// この関数内で出力
void Dijkstra(int s) {
fill((int* )cost, (int* )(cost + kMAX_V), kINF);
cost[s][0] = 0;
priority_queue<State, vector<State>, greater<State> > que;
que.push((State){s, 0, 0}); // (city, money, time)
while (!que.empty()) {
State s = que.top(); que.pop();
if (s.city == V - 1) {
cout << cost[s.city][s.money] << endl;
return;
}
if (cost[s.city][s.money] < s.time) continue;
for (int i = 0; i < graph[s.city].size(); i++) {
Edge e = graph[s.city][i];
if (s.money + e.money <= C &&
cost[e.to][s.money + e.money] > s.time + e.time) {
cost[e.to][s.money + e.money] = s.time + e.time;
que.push((State){e.to, s.money + e.money, s.time + e.time});
}
}
}
cout << -1 << endl;
}
void Solve() {
for (int i = 0; i < E; i++) {
graph[S[i] - 1].push_back((Edge){T[i] - 1, Y[i], M[i]});
}
Dijkstra(0);
}
int main() {
cin >> V >> C >> E;
for (int i = 0; i < E; i++) {
cin >> S[i];
}
for (int i = 0; i < E; i++) {
cin >> T[i];
}
for (int i = 0; i < E; i++) {
cin >> Y[i];
}
for (int i = 0; i < E; i++) {
cin >> M[i];
}
Solve();
return 0;
}
ふーらくたる