제출 #1180753

#제출 시각아이디문제언어결과실행 시간메모리
1180753asli_bgCommuter Pass (JOI18_commuter_pass)C++20
39 / 100
267 ms20796 KiB
#include<bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; #define int long long //#define int double typedef pair<int,int> pii; typedef vector<pii> vii; typedef vector<int> vi; typedef vector<bool> vb; #define FOR(i,a) for(int i=0;i<(a);i++) #define FORE(i,a,b) for(int i=(a);i<(b);i++) #define all(x) x.begin(),x.end() #define fi first #define se second #define pb push_back #define sp <<" "<< #define cont(x) for(auto el:x) cout<<el<<' ';cout<<endl; #define contp(x) for(auto el:x) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl; #define DEBUG(x) cout<<#x sp x<<endl; #define carp(x,y) ((x%MOD)*(y%MOD))%MOD #define topla(x,y) ((x%MOD)+(y%MOD))%MOD #define mid (l+r)/2 const int MAXN=1e5+5; const int MOD=1e9+7; const int INF=1e18; int n,m,s,t,u,v; vii adj[MAXN]; pii tut[MAXN]; void dij(int bas,bool f){ set<pii> s; s.insert({0,bas}); if(f) tut[bas].fi=0; else tut[bas].se=0; while(!s.empty()){ auto el=*s.begin(); s.erase(el); int nd=el.se; for(auto [kom,cost]:adj[nd]){ if(f){ //u if(tut[kom].fi>tut[nd].fi+cost){ if(s.count({tut[kom].fi,kom})) s.erase({tut[kom].fi,kom}); tut[kom].fi=tut[nd].fi+cost; s.insert({tut[kom].fi,kom}); } } else{ //v if(tut[kom].se>tut[nd].se+cost){ if(s.count({tut[kom].se,kom})) s.erase({tut[kom].se,kom}); tut[kom].se=tut[nd].se+cost; s.insert({tut[kom].se,kom}); } } } } } pii tut2[MAXN]; //s'den başlayıp bana gelen min pathtteki //{u'ya en yakın, v'ye en yakın mesafe} int dd[MAXN]; int p[MAXN]; void dij2(int bas){ set<pii> s; s.insert({0,bas}); dd[bas]=0; while(!s.empty()){ auto el=*s.begin(); s.erase(el); int nd=el.se; for(auto [kom,cost]:adj[nd]){ if(dd[kom]>dd[nd]+cost){ if(s.count({dd[kom],kom})) s.erase({dd[kom],kom}); p[kom]=nd; dd[kom]=dd[nd]+cost; s.insert({dd[kom],kom}); tut2[kom].fi=min(tut[kom].fi,tut2[nd].fi); tut2[kom].se=min(tut[kom].se,tut2[nd].se); } else if(dd[kom]==dd[nd]+cost){ int bir=min(tut2[nd].fi,tut[kom].fi); int iki=min(tut2[nd].se,tut[kom].se); if(bir+iki<tut2[kom].fi+tut2[kom].se){ p[kom]=nd; tut2[kom].fi=bir; tut2[kom].se=iki; s.insert({dd[kom],kom}); } } } } } signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>m; cin>>s>>t; cin>>u>>v; FOR(i,m){ int a,b,c; cin>>a>>b>>c; adj[a].pb({b,c}); adj[b].pb({a,c}); } FORE(i,1,n+1) tut[i].fi=tut[i].se=dd[i]=tut2[i].fi=tut2[i].se=INF; //u ve v'den herkese sp bul dij(u,true); dij(v,false); //FORE(i,1,n+1) cout<<"here" sp i sp tut[i].fi sp tut[i].se<<endl; dij2(s); vb mark(n+1,false); int x=t; while(x!=s){ mark[x]=true; x=p[x]; } mark[s]=true; int ans=0; if(!mark[u] and !mark[v]){ ans=min(tut[u].se,tut2[t].fi+tut2[t].se); } else if(!mark[v]){ ans=tut2[t].se; } else if(!mark[u]){ ans=tut2[t].fi; } cout<<ans<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...