結果
問題 | No.848 なかよし旅行 |
ユーザー | onakaT_Titai |
提出日時 | 2019-07-23 20:27:45 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 156 ms / 2,000 ms |
コード長 | 3,556 bytes |
コンパイル時間 | 1,390 ms |
コンパイル使用メモリ | 122,136 KB |
実行使用メモリ | 9,940 KB |
最終ジャッジ日時 | 2024-11-08 01:01:44 |
合計ジャッジ時間 | 3,517 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 26 |
ソースコード
#define _USE_MATH_DEFINES #include <iostream> #include <fstream> #include <sstream> #include <string> #include <cstring> #include <vector> #include <set> #include <map> #include <unordered_map> #include <queue> #include <deque> #include <stack> #include <algorithm> #include <bitset> #include <cmath> #include <cstdlib> #include <ctime> #include <numeric> #include <functional> #include <cctype> #include <list> #include <limits> #include <cassert> #include <random> #include <time.h> //#include <boost/multiprecision/cpp_int.hpp> using namespace std; using Int = long long; //using namespace boost::multiprecision; const double EPS = 1e-10; long long const MOD = 1000000007; long long mod_pow(long long x, long long n) { long long res = 1; for (int i = 0;i < 60; i++) { if (n >> i & 1) res = res * x % MOD; x = x * x % MOD; } return res; } template<typename T> T gcd(T a, T b) { return b != 0 ? gcd(b, a % b) : a; } template<typename T> T lcm(T a, T b) { return a * b / gcd(a, b); } void fastInput() { cin.tie(0); ios::sync_with_stdio(false); } struct Edge{ int from, to, cost; bool operator <(const Edge &e) const { return cost < e.cost; } bool operator >(const Edge &e) const { return cost > e.cost; } bool operator ==(const Edge &e) const { return cost == e.cost; } bool operator !=(const Edge &e) const { return cost != e.cost; } }; template <typename T> vector<T> dijkstra(vector<vector<Edge>> &G, int s) { int V = G.size(); vector<T> d(V); fill(d.begin(), d.end(), numeric_limits<T>::max()); priority_queue<pair<T, int> , vector<pair<T, int>>, greater<pair<T, int>>> que; d[s] = 0; que.push(make_pair(0,s)); while (!que.empty()) { pair<T, int> p = que.top(); que.pop(); int v = p.second; if (d[v] < p.first) continue; for (int i=0; i<G[v].size(); i++) { Edge e = G[v][i]; if (d[e.to] > d[v] + e.cost) { d[e.to] = d[v] + e.cost; que.push(make_pair(d[e.to], e.to)); } } } return d; } vector<vector<Edge>> G; vector<Int> DistFromStart; vector<Int> DistFromP; vector<Int> DistFromQ; Int T; int main(void) { Int N, M, P, Q; cin >> N >> M >> P >> Q >> T; P--, Q--; G = vector<vector<Edge>>(N); for (int i = 0; i < M; i++) { int a, b, c; cin >> a >> b >> c; a--, b--, c; G[a].push_back({a, b, c}); G[b].push_back({b, a, c}); } DistFromStart = dijkstra<Int>(G, 0); DistFromP = dijkstra<Int>(G, P); DistFromQ = dijkstra<Int>(G, Q); Int ans = -1; for (int i = 0; i < G.size(); i++) { for (int j = 0; j < G.size(); j++) { Int sum = 0; sum += DistFromStart[i]; sum += max(DistFromP[i]+DistFromP[j], DistFromQ[i]+DistFromQ[j]); sum += DistFromStart[j]; if (sum <= T) { ans = max(DistFromStart[i]+DistFromStart[j]+T-sum, ans); } } } if (DistFromStart[P] + DistFromP[Q] + DistFromQ[0] <= T) { Int tmp = DistFromStart[P] + DistFromP[Q] + DistFromP[0]; ans = max(DistFromStart[P] + DistFromP[Q] + DistFromP[0] + T - tmp, ans); } if (DistFromStart[Q] + DistFromQ[P] + DistFromP[0] <= T) { Int tmp = DistFromStart[Q] + DistFromQ[P] + DistFromP[0]; ans = max(DistFromStart[Q] + DistFromQ[P] + DistFromP[0] + T - tmp, ans); } cout << ans << endl; return 0; }