結果
| 問題 |
No.1 道のショートカット
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-01-16 16:11:51 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 5,000 ms |
| コード長 | 1,665 bytes |
| コンパイル時間 | 774 ms |
| コンパイル使用メモリ | 79,992 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-20 16:07:57 |
| 合計ジャッジ時間 | 1,749 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 40 |
ソースコード
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int INF = 1e9;
struct data {
int town;
int cost;
int minute;
};
int main() {
int n, c, v;
vector<int> s, t, y, m;
cin >> n >> c >> v;
s.assign(v, 0);
t.assign(v, 0);
y.assign(v, 0);
m.assign(v, 0);
int input;
for (int i = 0; i < v; i++) {
cin >> input;
s[i] = input;
}
for (int i = 0; i < v; i++) {
cin >> input;
t[i] = input;
}
for (int i = 0; i < v; i++) {
cin >> input;
y[i] = input;
}
for (int i = 0; i < v; i++) {
cin >> input;
m[i] = input;
}
vector< vector< data > > connect; // town -> (town, cost, time)
connect.assign(n + 1, vector<data>());
for (int i = 0; i < v; i++) {
data tmp = {t[i], y[i], m[i]};
connect[s[i]].push_back(tmp);
}
// dp[town][cost] town に cost以下 でこれる mintime
vector < vector<int> > dp;
dp.assign(n + 1, vector<int>(c + 1, INF));
for (int i = 0; i <= c; i++) {
dp[0][i] = 0;
}
queue<data> que;
data pos = {1, 0, 0};
que.push(pos);
while (!que.empty()) {
data pos = que.front();
que.pop();
if (dp[pos.town][pos.cost] <= pos.minute) {
continue;
}
for (int i = pos.cost; i <= c; i++) {
if (dp[pos.town][i] > pos.minute) {
dp[pos.town][i] = pos.minute;
}
}
int pt = pos.town;
for (int i = 0; i < connect[pt].size(); i++) {
if (connect[pt][i].cost + pos.cost <= c) {
data tmp = {
connect[pt][i].town,
connect[pt][i].cost + pos.cost,
connect[pt][i].minute + pos.minute
};
que.push(tmp);
}
}
}
int ans = dp[n][c];
if (ans == INF) {
ans = -1;
}
cout << ans << endl;
return 0;
}