Submission #538438

#TimeUsernameProblemLanguageResultExecution timeMemory
538438MohamedFaresNebiliCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
467 ms31124 KiB
#include <bits/stdc++.h> /// #pragma GCC optimize ("Ofast") /// #pragma GCC target ("avx2") using namespace std; using ll = long long; using ii = pair<ll, ll>; using vi = vector<int>; using db = double; #define ff first #define ss second #define pb push_back #define all(x) x.begin(), x.end() #define lb lower_bound #define ub upper_bound const ll INF = LONG_LONG_MAX / 2; using pi = pair<ll, ii>; ll n, m, s, t, u, v; vector<array<ll, 2>> adj[100001]; ll disU[100001], disV[100001]; ll dp[2][100001], res; void dijkstra(ll src, ll arr[]) { for(ll l = 1; l <= n; l++) arr[l] = INF; priority_queue<ii, vector<ii>, greater<ii>> pq; arr[src] = 0; pq.push({0, src}); while(!pq.empty()) { ll a = pq.top().ss; ll w = pq.top().ff; pq.pop(); if(arr[a] < w) continue; for(auto e : adj[a]) { ll len = e[1] + w; ll to = e[0]; if(arr[to] <= len) continue; arr[to] = len; pq.push({len, to}); } } } void dijkstra0() { for(ll l = 0; l <= n; l++) dp[0][l] = dp[1][l] = INF; priority_queue<pi, vector<pi>, greater<pi>> pq; pq.push({0, {s, 0}}); vector<bool> vis(n + 1, 0); vector<long long> dis(n + 1, INF); while(!pq.empty()) { ll a = pq.top().ss.ff, par = pq.top().ss.ss; ll w = pq.top().ff; pq.pop(); if(!vis[a]) { vis[a] = 1; dis[a] = w; dp[0][a] = min(disU[a], dp[0][par]); dp[1][a] = min(disV[a], dp[1][par]); for(auto u : adj[a]) { pq.push({u[1] + w, {u[0], a}}); } } else if(w == dis[a]) if(min(dp[0][par], disU[a]) + min(dp[1][par], disV[a]) <= dp[0][a] + dp[1][a]) { dp[0][a] = min(disU[a], dp[0][par]); dp[1][a] = min(disV[a], dp[1][par]); } } res = min(res, dp[0][t] + dp[1][t]); } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m >> s >> t >> u >> v; for(ll l = 0; l < m; l++) { ll x, y; ll w; cin >> x >> y >> w; adj[x].pb({y, w}); adj[y].pb({x, w}); } dijkstra(u, disU); dijkstra(v, disV); res = disU[v]; dijkstra0(); swap(s, t); dijkstra0(); cout << res << "\n"; } /** 8 8 5 7 6 8 1 2 2 2 3 3 3 4 4 1 4 1 1 5 5 2 6 6 3 7 7 4 8 8 **/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...