Submission #1308887

#TimeUsernameProblemLanguageResultExecution timeMemory
1308887kevin264Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
197 ms33236 KiB
#include "bits/stdc++.h" using namespace std; #define int long long #define endl '\n' #define sz(x) (int)(x.size()) #define ff first #define ss second #define m_p make_pair #define INF LLONG_MAX #define OO LLONG_MAX using vi=vector<int>; using vvi=vector<vi>; using pii=pair<int,int>; template<typename T> using inverse_pq = priority_queue<T,vector<T>, greater<T> >; template<typename T=int> void cin_vector(vector<T> &v) {for(int& i : v) cin>>i;} vvi void_vector=vvi(); void djikstra(vector<vector<pii> >& g, vi& dist, int start, int end=-1, vvi& dag=void_vector){ inverse_pq<pii> pq; vvi father(g.size()); vector<bool> mark(g.size(),false); pq.push({0,start}); dist[start]=0; while(!pq.empty()){ int top=pq.top().ss; pq.pop(); if(mark[top]) continue; mark[top]=true; for(auto i : g[top]){ int d=i.ss+dist[top]; if(d==dist[i.ff]){ father[i.ff].push_back(top); }else if(d<dist[i.ff]){ vector<int> aux(1,top); dist[i.ff]=d; father[i.ff].swap(aux); pq.push({d,i.ff}); } } } if(end!=-1){ queue<int> q; vector<bool> v(dag.size(), false); q.push(end); v[end]=true; while(!q.empty()){ int top=q.front(); q.pop(); for(int i : father[top]){ dag[i].push_back(top); if(!v[i]){ q.push(i); v[i]=true; } } } } } void dfs(vvi& g, vi& distu, vi& distv, vector<pair<int,pii>>& nemo, int start){ int a=distu[start]; int b=distv[start]; nemo[start].ss.ff=a; nemo[start].ss.ss=b; nemo[start].ff=a+b; for(int i : g[start]){ if(nemo[i].ff==INF){ dfs(g, distu, distv,nemo, i); } nemo[start].ff=min(nemo[start].ff, min(a+nemo[i].ss.ss,b+nemo[i].ss.ff)); nemo[start].ss.ff=min(nemo[start].ss.ff,nemo[i].ss.ff); nemo[start].ss.ss=min(nemo[start].ss.ss,nemo[i].ss.ss); } } int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(0); int n,m; cin>>n>>m; int s,t,u,v; cin>>s>>t>>u>>v; vector<vector<pii> > g(n+1); while(m--){ int a,b,w; cin>>a>>b>>w; g[a].push_back(m_p(b,w)); g[b].push_back(m_p(a,w)); } vi dist(n+1, INF), distu(n+1, INF), distv(n+1, INF); vvi dag(n+1); djikstra(g,distu, u); djikstra(g,distv, v); djikstra(g,dist, s, t, dag); vector<pair<int,pii>> nemo(n+1,m_p(INF,m_p(INF,INF))); dfs(dag, distu, distv, nemo, s) ; int ans=INF; for(auto i : nemo) ans=min(ans,i.ff); cout<<min(distu[v], ans)<<endl; 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...