제출 #43542

#제출 시각아이디문제언어결과실행 시간메모리
43542wxh010910Commuter Pass (JOI18_commuter_pass)C++14
100 / 100
416 ms142152 KiB
#include <bits/stdc++.h> using namespace std; #define X first #define Y second #define mp make_pair #define pb push_back #define Debug(...) fprintf(stderr, __VA_ARGS__) typedef long long LL; typedef long double LD; typedef unsigned int uint; typedef pair <int, int> pii; typedef unsigned long long uLL; template <typename T> inline void Read(T &x) { char c = getchar(); bool f = false; for (x = 0; !isdigit(c); c = getchar()) { if (c == '-') { f = true; } } for (; isdigit(c); c = getchar()) { x = x * 10 + c - '0'; } if (f) { x = -x; } } template <typename T> inline bool CheckMax(T &a, const T &b) { return a < b ? a = b, true : false; } template <typename T> inline bool CheckMin(T &a, const T &b) { return a > b ? a = b, true : false; } const int N = 100005; const LL inf = 1LL << 60; LL ans, f[N], g[N], S[N], T[N], U[N], V[N]; priority_queue <pair <LL, int>> q; int n, m, s, t, u, v, top, seq[N]; vector <pii> adj[N]; bool vis[N]; inline void Dijkstra(int s, LL *d) { for (int i = 1; i <= n; ++i) { vis[i] = false, d[i] = inf; } d[s] = 0, q.push(mp(0, s)); while (!q.empty()) { int x = q.top().Y; q.pop(); if (vis[x]) { continue; } vis[x] = true; for (auto e : adj[x]) { if (CheckMin(d[e.X], d[x] + e.Y)) { q.push(mp(-d[e.X], e.X)); } } } } int main() { #ifdef wxh010910 freopen("d.in", "r", stdin); #endif Read(n), Read(m), Read(s), Read(t), Read(u), Read(v); for (int i = 1, x, y, w; i <= m; ++i) { Read(x), Read(y), Read(w); adj[x].pb(mp(y, w)), adj[y].pb(mp(x, w)); } Dijkstra(s, S), Dijkstra(t, T), Dijkstra(u, U), Dijkstra(v, V), ans = u[V]; for (int i = 1; i <= n; ++i) { if (S[i] + T[i] == S[t]) { seq[++top] = i, f[i] = U[i], g[i] = V[i]; } } sort(seq + 1, seq + top + 1, [&](const int &x, const int &y) { return S[x] < S[y]; }); for (int i = 1; i <= top; ++i) { int x = seq[i]; for (auto e : adj[x]) { if (S[e.X] + e.Y == S[x]) { CheckMin(f[x], f[e.X]), CheckMin(g[x], g[e.X]); } } CheckMin(ans, f[x] + V[x]), CheckMin(ans, g[x] + U[x]); } printf("%lld\n", ans); #ifdef wxh010910 Debug("My Time: %.3lfms\n", (double)clock() / CLOCKS_PER_SEC); #endif return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...