結果
| 問題 |
No.848 なかよし旅行
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2019-07-05 22:20:29 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,956 bytes |
| コンパイル時間 | 1,941 ms |
| コンパイル使用メモリ | 184,260 KB |
| 実行使用メモリ | 10,060 KB |
| 最終ジャッジ日時 | 2024-10-06 22:11:50 |
| 合計ジャッジ時間 | 3,709 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 7 WA * 19 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vi = vector<int>;
using vll = vector<ll>;
using vvi = vector<vector<int>>;
using vvl = vector<vector<ll>>;
ll INF = 1010101010101010LL;
vector<vector<pair<int, ll>>> ps;
struct N {
ll i, d;
N(int i, ll d) : i(i), d(d) {}
};
bool operator<(const N &l, const N &r) {
return l.d > r.d;
}
int main() {
cin.tie(nullptr);
ios::sync_with_stdio(false);
ll n, m, p, q, t;
cin >> n >> m >> p >> q >> t;
p--;
q--;
vector<ll> fromp(n, INF), fromq(n, INF), from1(n, INF);
ps.resize(n);
for (int i = 0; i < m; i++) {
ll a, b, c;
cin >> a >> b >> c;
a--;
b--;
ps[a].emplace_back(b, c);
ps[b].emplace_back(a, c);
}
priority_queue<N> queue;
queue.emplace(p, 0);
while (queue.size()) {
auto v = queue.top();
queue.pop();
if (fromp[v.i] < INF) continue;
fromp[v.i] = v.d;
for (auto &path : ps[v.i]) {
if (fromp[path.first] < INF) continue;
queue.emplace(path.first, v.d + path.second);
}
}
queue.emplace(q, 0);
while (queue.size()) {
auto v = queue.top();
queue.pop();
if (fromq[v.i] < INF) continue;
fromq[v.i] = v.d;
for (auto &path : ps[v.i]) {
if (fromq[path.first] < INF) continue;
queue.emplace(path.first, v.d + path.second);
}
}
queue.emplace(0, 0);
while (queue.size()) {
auto v = queue.top();
queue.pop();
if (from1[v.i] < INF) continue;
from1[v.i] = v.d;
for (auto &path : ps[v.i]) {
if (from1[path.first] < INF) continue;
queue.emplace(path.first, v.d + path.second);
}
}
ll ans = -1;
for (int i = 0; i < n; i++) {
ll pcost = fromp[i] * 2;
ll qcost = fromq[i] * 2;
ll cost = from1[i] * 2;
if (max(pcost, qcost) + cost <= t) {
ans = max(ans, t - max(pcost, qcost));
}
if (cost + pcost + qcost <= t) {
ans = t;
}
}
cout << ans << endl;
return 0;
}