結果
| 問題 |
No.848 なかよし旅行
|
| コンテスト | |
| ユーザー |
hrbt__
|
| 提出日時 | 2019-07-24 11:55:33 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 154 ms / 2,000 ms |
| コード長 | 2,417 bytes |
| コンパイル時間 | 1,917 ms |
| コンパイル使用メモリ | 179,000 KB |
| 実行使用メモリ | 10,736 KB |
| 最終ジャッジ日時 | 2024-11-08 01:00:42 |
| 合計ジャッジ時間 | 4,067 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 26 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define dmp(x) cerr << __LINE__ << " " << #x << " " << x << endl;
#define line(obj) for (auto itr = begin(obj); itr != end(obj); itr++) s << ((itr == begin(obj)) ? "" : ", ") << *itr
template <typename T1, typename T2>
ostream& operator<<(ostream& s, const pair<T1, T2>& p) {
s << "(";
s << p.first << ", " << p.second;
s << ")";
return s;
}
template <typename T>
ostream& operator<<(ostream& s, const vector<T>& v) {
s << "[";
line(v);
s << "]";
return s;
}
template <typename T>
ostream& operator<<(ostream& s, const vector<vector<T>>& vv) {
s << "[";
line(vv);
s << "]";
return s;
}
template <typename T1, typename T2>
ostream& operator<<(ostream& s, const map<T1, T2>& m) {
s << "{";
line(m);
s << "}";
return s;
}
template <typename T>
struct Dijkstra {
struct Edge {
int to;
T cost;
};
vector<int> prev;
vector<vector<Edge>> g;
Dijkstra(int n) : prev(n, -1), g(n) {}
void addEdge(int u, int v, T w) {
g[u].push_back({v, w});
g[v].push_back({u, w});
}
vector<T> build(int s) {
vector<T> dist(g.size(), -1);
using Node = pair<T, int>;
priority_queue<Node, vector<Node>, greater<Node>> pq;
pq.push({dist[s] = 0, s});
while (!pq.empty()) {
auto d = pq.top().first;
auto u = pq.top().second;
pq.pop();
if (dist[u] < d) continue;
for (auto&& v : g[u]) {
if (dist[v.to] < 0 || dist[v.to] > dist[u] + v.cost) {
dist[v.to] = dist[u] + v.cost;
prev[v.to] = u;
pq.push({dist[v.to], v.to});
}
}
}
return dist;
}
vector<int> getPath(int t) {
vector<int> path;
for (; t != -1; t = prev[t]) path.push_back(t);
reverse(begin(path), end(path));
return path;
}
};
int main() {
int n, m, p, q, t;
cin >> n >> m >> p >> q >> t, p--, q--;
Dijkstra<ll> g(n);
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c, a--, b--;
g.addEdge(a, b, c);
}
auto zs = g.build(0);
auto ps = g.build(p);
auto qs = g.build(q);
if (zs[p] + zs[q] + ps[q] <= t) {
cout << t << endl;
return 0;
}
ll ans = -1;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
ll mx = max(ps[i] + ps[j], qs[i] + qs[j]);
if (zs[i] + zs[j] + mx > t) continue;
ans = max(ans, t - mx);
}
}
cout << ans << endl;
}
hrbt__