제출 #209856

#제출 시각아이디문제언어결과실행 시간메모리
209856kshitij_sodaniCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
484 ms30436 KiB
#include <iostream> #include <bits/stdc++.h> using namespace std; #define mp make_pair #define pb push_back typedef int64_t llo; #define a first #define b second #define endl "\n" vector<pair<llo,llo>> adj[100001]; //vector<pair<llo,llo>> adj2[100001]; vector<pair<llo,llo>> adj3[100001]; llo dis3[100001]; llo dis4[100001]; llo fin; llo dp3[100001]; llo dp4[100001]; llo dp(llo no){ llo mi=fin; llo ma=dis3[no]; for(auto j:adj3[no]){ if(dp3[j.a]==-1){ dp(j.a); } ma=min(ma,dp3[j.a]); mi=min(mi,dp3[j.a]+dis4[no]); } fin=min(fin,mi); dp3[no]=ma; return ma; } llo dp2(llo no){ llo mi=fin; llo ma=dis4[no]; for(auto j:adj3[no]){ if(dp4[j.a]==-1){ dp2(j.a); } ma=min(ma,dp4[j.a]); mi=min(mi,dp4[j.a]+dis3[no]); } fin=min(fin,mi); dp4[no]=ma; return ma; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); memset(dp3,-1,sizeof(dp3)); memset(dp4,-1,sizeof(dp4)); llo n,m,s,t,u,v; cin>>n>>m; cin>>s>>t; cin>>u>>v; s-=1; t-=1; u-=1; v-=1; llo aa,bb,cc; for(llo i=0;i<m;i++){ cin>>aa>>bb>>cc; adj[aa-1].pb(mp(bb-1,cc)); adj[bb-1].pb({aa-1,cc}); } llo dis[n]; memset(dis,-1,sizeof(dis)); dis[s]=0; priority_queue<pair<llo,llo>> pp; pp.push({0,s}); while(!pp.empty()){ pair<llo,llo> no=pp.top(); pp.pop(); no.a=-no.a; for(auto nn:adj[no.b]){ if(dis[nn.a]==-1 or no.a+nn.b<dis[nn.a]){ dis[nn.a]=no.a+nn.b; pp.push(mp(-dis[nn.a],nn.a)); } } } // cout<<dis[t]<<endl; llo dis2[n]; memset(dis2,-1,sizeof(dis2)); dis2[t]=0; pp.empty(); pp.push({0,t}); while(!pp.empty()){ pair<llo,llo> no=pp.top(); pp.pop(); no.a=-no.a; for(auto nn:adj[no.b]){ if(dis2[nn.a]==-1 or no.a+nn.b<dis2[nn.a]){ dis2[nn.a]=no.a+nn.b; pp.push(mp(-dis2[nn.a],nn.a)); } } } for(llo i=0;i<n;i++){ for(auto j:adj[i]){ if(dis[i]+dis2[j.a]+j.b==dis[t]){ // cout<<i<<" "<<j.a<<endl; // adj2[i].pb({j.a,j.b}); adj3[j.a].pb({i,j.b}); } } } memset(dis3,-1,sizeof(dis3)); dis3[u]=0; pp.empty(); pp.push({0,u}); while(!pp.empty()){ pair<llo,llo> no=pp.top(); pp.pop(); no.a=-no.a; for(auto nn:adj[no.b]){ if(dis3[nn.a]==-1 or no.a+nn.b<dis3[nn.a]){ dis3[nn.a]=no.a+nn.b; pp.push(mp(-dis3[nn.a],nn.a)); } } } memset(dis4,-1,sizeof(dis4)); dis4[v]=0; pp.empty(); pp.push({0,v}); while(!pp.empty()){ pair<llo,llo> no=pp.top(); pp.pop(); no.a=-no.a; for(auto nn:adj[no.b]){ if(dis4[nn.a]==-1 or no.a+nn.b<dis4[nn.a]){ dis4[nn.a]=no.a+nn.b; pp.push(mp(-dis4[nn.a],nn.a)); } } } fin=dis3[v]; // cout<<fin<<endl; dp(t); dp2(t); // dp3(s); // dp4(s); cout<<fin<<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...