Submission #1322178

#TimeUsernameProblemLanguageResultExecution timeMemory
1322178goppamachCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
161 ms22320 KiB
#include <bits/stdc++.h> using namespace std; #define el "\n" #define pii pair<int, int> #define pll pair<ll, ll> #define fi first #define se second #define mp make_pair #define sqr(x) ((x) * (x)) #define FOR(i, l, r) for (int i = l; i <= (r); i++) #define FOD(i, l, r) for (int i = l; i >= (r); i--) #define all(x) begin(x), end(x) #define rall(x) rbegin(x), rend(x) #define sz(x) ((int)(x).size()) #define fast_io ios_base::sync_with_stdio(false); cin.tie(nullptr); using db = long double; using ll = long long; using ull = unsigned long long; using vi = vector<int>; using vll = vector<ll>; using vpii = vector<pii>; using vpll = vector<pll>; using vvi = vector<vi>; using vvll = vector<vll>; using vbool = vector<bool>; using vvbool = vector<vbool>; template <typename T> using heap = priority_queue<T>; template <typename T> using min_heap = priority_queue<T, vector<T>, greater<T>>; template<class T> inline bool chmax(T &a, T const &b) { return (a < b ? (a = b, true) : false); } template<class T> inline bool chmin(T &a, T const &b) { return (a > b ? (a = b, true) : false); } // #define DEBUG #ifdef DEBUG #include "D:\cpp\debug.h" #else #define debug(...) #define debug_arr(...) #endif mt19937 rng((uint32_t)chrono::steady_clock::now().time_since_epoch().count()); constexpr int N = 1E5 + 5; constexpr int INF = 1E9 + 7; constexpr ll INFLL = 4E18; constexpr int MOD = 1E9 + 7; // 998244353 constexpr double EPS = 1E-10; using Edge = tuple<int, int, int>; vpii adj[N]; vi dag[N]; int in[N]; ll d_s[N], d_u[N], d_v[N], d[N]; ll dp[N], dp_u[N], dp_v[N]; int n, m, s, t, u, v; void dijkstra(int s, ll d[]) { min_heap<pair<ll, int>> pq; fill(d + 1, d + n + 1, INFLL); pq.emplace(0, s); d[s] = 0; while (!pq.empty()) { auto [dist, u] = pq.top(); pq.pop(); if (dist != d[u]) continue; for (auto &[v, w] : adj[u]) { if (chmin(d[v], d[u] + w)) { pq.emplace(d[v], v); } } } } void solve() { cin >> n >> m >> s >> t >> u >> v; vector<Edge> edges; while (m--) { int a, b, w; cin >> a >> b >> w; adj[a].emplace_back(b, w); adj[b].emplace_back(a, w); edges.emplace_back(a, b, w); } dijkstra(s, d_s); dijkstra(u, d_u); dijkstra(v, d_v); for (auto &[a, b, w] : edges) { if (d_s[a] + w == d_s[b]) { dag[a].push_back(b); in[b]++; } if (d_s[b] + w == d_s[a]) { dag[b].push_back(a); in[a]++; } } vi topo; queue<int> q; q.push(s); while (!q.empty()) { int x = q.front(); q.pop(); topo.push_back(x); for (int y : dag[x]) { if (--in[y] == 0) { q.push(y); } } } fill(all(dp), INFLL); fill(all(dp_u), INFLL); fill(all(dp_v), INFLL); dp_u[s] = d_u[s]; dp_v[s] = d_v[s]; dp[s] = dp_u[s] + dp_v[s]; for (int x : topo) { chmin(dp[x], min(dp_u[x] + d_v[x], dp_v[x] + d_u[x])); for (int y : dag[x]) { chmin(dp[y], dp[x]); chmin(dp_u[y], min(dp_u[x], d_u[y])); chmin(dp_v[y], min(dp_v[x], d_v[y])); } } cout << min(dp[t], d_u[v]) << el; } int main() { fast_io #define LOCAL #ifndef LOCAL #define PROBLEM "" freopen(PROBLEM ".INP", "r", stdin); freopen(PROBLEM ".OUT", "w", stdout); #endif int t = 1; // cin >> t; while (t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...