Submission #1279731

#TimeUsernameProblemLanguageResultExecution timeMemory
1279731hanguyendanghuyCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
568 ms20308 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define fi first #define se second constexpr ll MAXN=1e5+5,MAXV=3e5,MOD=1e9+7,INF=1e18; ll n,m,i,j,p,k,ans,dem,st,en,dist[3][MAXN],S,T,U,V,len[MAXN],miV[MAXN],miU[MAXN]; vector<pair<ll,ll>> adj[MAXN]; void dij(ll st,ll type){ priority_queue<pair<ll,ll>> q; dist[type][st]=0; q.push({0,st}); while(q.size()){ auto k=q.top();q.pop(); if(-k.fi>dist[type][k.se]) continue; for(auto x:adj[k.se]){ if(dist[type][x.fi]>-k.fi+x.se){ dist[type][x.fi]=-k.fi+x.se; q.push({-dist[type][x.fi],x.fi}); } } } } void solve(int start, int end) { vector<ll> dist_from_start(n + 1, INF); vector<ll> min_du_on_path(n + 1, INF); vector<ll> min_dv_on_path(n + 1, INF); dist_from_start[start] = 0; min_du_on_path[start] = dist[1][start]; min_dv_on_path[start] = dist[2][start]; priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq; pq.push({0, start}); while (!pq.empty()) { ll d = pq.top().first; int u = pq.top().second; pq.pop(); if (d > dist_from_start[u]) { continue; } for (auto& edge : adj[u]) { int v_neighbor = edge.first; ll weight = edge.second; ll new_dist = dist_from_start[u] + weight; ll new_min_du = min(min_du_on_path[u], dist[1][v_neighbor]); ll new_min_dv = min(min_dv_on_path[u], dist[2][v_neighbor]); if (new_dist < dist_from_start[v_neighbor]) { dist_from_start[v_neighbor] = new_dist; min_du_on_path[v_neighbor] = new_min_du; min_dv_on_path[v_neighbor] = new_min_dv; pq.push({new_dist, v_neighbor}); } else if (new_dist == dist_from_start[v_neighbor]) { if (new_min_du + new_min_dv < min_du_on_path[v_neighbor] + min_dv_on_path[v_neighbor]) { min_du_on_path[v_neighbor] = new_min_du; min_dv_on_path[v_neighbor] = new_min_dv; pq.push({new_dist, v_neighbor}); } } } } if (dist_from_start[end] != INF) { ans = min(ans, min_du_on_path[end] + min_dv_on_path[end]); } } int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); cin>>n>>m>>S>>T>>U>>V; for(i=1;i<=m;i++){ ll u,v,c; cin>>u>>v>>c; adj[u].pb({v,c}); adj[v].pb({u,c}); } for(i=1;i<=n;i++) dist[1][i]=dist[2][i]=INF; dij(U,1); dij(V,2); ans=dist[1][V]; solve(S,T); solve(T,S); cout<<ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...