結果
| 問題 |
No.1 道のショートカット
|
| コンテスト | |
| ユーザー |
uenoku
|
| 提出日時 | 2017-01-09 00:11:35 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,947 bytes |
| コンパイル時間 | 612 ms |
| コンパイル使用メモリ | 75,188 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-08 04:36:51 |
| 合計ジャッジ時間 | 1,713 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 36 WA * 4 |
ソースコード
#include <algorithm>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <vector>
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for (int i = (n)-1; i >= 0; i--)
using namespace std;
typedef long long int lli;
lli MOD = 1000000007;
int n, c, v;
struct edge {
lli s, t, y, m;
};
struct node {
lli cur, d, time;
};
vector<edge> e[1555];
bool ok(lli time)
{
lli dis[100] = {};
rep(i, 100) dis[i] = -1;
auto comp = [](const node l, const node r) {
return l.d < r.d;
};
priority_queue<node, vector<node>, decltype(comp)> que(comp);
que.push(node{0, 0, 0});
while (!que.empty()) {
lli d = que.top().d;
lli cur = que.top().cur;
lli t = que.top().time;
//cout << cur << endl;
que.pop();
if (dis[cur] >= 0 && dis[cur] < d)
continue;
dis[cur] = d;
rep(i, e[cur].size())
{
int nx = e[cur][i].t;
if ((dis[nx] >= 0 && dis[nx] < e[cur][i].y + d) || t + e[cur][i].m > time)
continue;
que.push(node{
nx, e[cur][i].y + d, t + e[cur][i].m});
dis[nx] = e[cur][i].y + d;
}
}
if (dis[n - 1] == -1)
return false;
return dis[n - 1] <= c;
}
int main()
{
cin >> n >> c >> v;
lli s[2000], t[2000], y[2000], m[2000];
rep(i, v) cin >> s[i];
rep(i, v) cin >> t[i];
rep(i, v) cin >> y[i];
rep(i, v) cin >> m[i];
rep(i, v)
{
s[i]--, t[i]--;
e[s[i]].push_back(edge{s[i], t[i], y[i], m[i]});
e[t[i]].push_back(edge{t[i], s[i], y[i], m[i]});
}
lli up = 1e12;
lli low = 0;
if (!ok(up)) {
cout << -1 << endl;
return 0;
}
while (up - low > 1) {
lli mid = (up + low) / 2;
if (ok(mid))
up = mid;
else
low = mid;
}
cout << up << endl;
}
uenoku