結果
問題 | No.848 なかよし旅行 |
ユーザー | square1001 |
提出日時 | 2019-07-05 22:15:34 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 847 ms / 2,000 ms |
コード長 | 1,513 bytes |
コンパイル時間 | 845 ms |
コンパイル使用メモリ | 83,072 KB |
実行使用メモリ | 10,596 KB |
最終ジャッジ日時 | 2024-11-08 00:50:17 |
合計ジャッジ時間 | 4,391 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 26 |
ソースコード
#include <queue> #include <vector> #include <iostream> #include <algorithm> using namespace std; const long long inf = 1LL << 61; struct edge { int to; long long cost; }; struct state { int pos; long long cost; }; bool operator<(const state& s1, const state& s2) { return s1.cost > s2.cost; } vector<long long> dijkstra(vector<vector<edge> >& G, int src) { vector<long long> dist(G.size(), inf); dist[src] = 0; priority_queue<state> que; que.push(state{ src, 0 }); while (!que.empty()) { int u = que.top().pos; que.pop(); for (edge e : G[u]) { if (dist[e.to] > dist[u] + e.cost) { dist[e.to] = dist[u] + e.cost; que.push(state{ e.to, dist[e.to] }); } } } return dist; } int main() { int N, M, P, Q; long long T; cin >> N >> M >> P >> Q >> T; --P, --Q; vector<vector<edge> > G(N); for (int i = 0; i < M; ++i) { int a, b; long long c; cin >> a >> b >> c; --a, --b; G[a].push_back(edge{ b, c }); G[b].push_back(edge{ a, c }); } vector<long long> s0 = dijkstra(G, 0); vector<long long> sp = dijkstra(G, P); vector<long long> sq = dijkstra(G, Q); if (max(sp[0] * 2, sq[0] * 2) > T) { cout << -1 << endl; } else if (s0[P] + sp[Q] + sq[0] <= T) { cout << T << endl; } else { long long ans = 0; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { long long sum = s0[i] + max(sp[i] + sp[j], sq[i] + sq[j]) + s0[j]; if (sum <= T) { ans = max(ans, T - max(sp[i] + sp[j], sq[i] + sq[j])); } } } cout << ans << endl; } return 0; }