제출 #228510

#제출 시각아이디문제언어결과실행 시간메모리
228510dvdg6566Olympic Bus (JOI20_ho_t4)C++14
0 / 100
105 ms4392 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<int> vi; typedef pair<int,int> pi; typedef vector<pi> vpi; typedef long double ld; #define pb emplace_back #define emp emplace #define mp make_pair #define lb lower_bound #define ub upper_bound #define ALL(x) x.begin(), x.end() #define SZ(x) (ll)x.size() #define f first #define s second const ll MAXN = 210; const int MAXE = 50100; const ll INF = 1e9; const ll MOD = 1e9+7; typedef pair<pi,pi> pp; typedef pair<int,pi> pip; vector<vector<pip>> V,O,S; vi f1,fn,b1,bn; int N,E,a,b,w,r; int U[MAXE]; int l[MAXN]; vector<pp> Edge; priority_queue<pi,vpi,greater<pi>>pq; int BLOCK=-1; void dijkstra(int x, vector<vector<pip>> &A, vi &D){ // cout<<x<<'\n'; D.resize(N+1); for(int i=1;i<=N;++i)D[i]=INF; D[x]=0; pq.emp(0,x); while(SZ(pq)){ pi t=pq.top();pq.pop(); int n=t.s;int d=t.f; if(D[n]>d)continue; if(n!=x)U[l[n]]=1; for(auto t:A[n]){ int c=t.f;int nd=d+t.s.f; if(nd>=D[c])continue; if(t.s.s==BLOCK)continue; D[c]=nd; l[c]=t.s.s; pq.emp(nd,c); } } } int main(){ cin>>N>>E; V.resize(N+1);O.resize(N+1);S.resize(N+1); for (int i=0;i<E;++i){ cin>>a>>b>>w>>r; V[a].pb(b, mp(w,i)); O[b].pb(a, mp(w,i)); Edge.pb(mp(a,b),mp(w,r)); } dijkstra(1,V,f1); dijkstra(N,V,fn); dijkstra(1,O,b1); dijkstra(N,O,bn); // for (int i=0;i<E;++i)cout<<U[i]<<' ';cout<<'\n'; int ans=f1[N]+bn[1]; // cout<<ans<<'\n'; for(int i=0;i<E;++i)if(U[i]){ S[Edge[i].f.f].pb(Edge[i].f.s, mp(Edge[i].s.f, i)); } for(int i=0;i<E;++i)if(!U[i]){ int a=Edge[i].f.f;int b=Edge[i].f.s;int w=Edge[i].s.f; int forward=min(f1[N],f1[b]+w+bn[a]); int back=min(fn[1],fn[b]+w+b1[a]); int tw=Edge[i].s.s+forward+back; ans=min(ans,tw); } for (int i=0;i<E;++i)if(U[i]){ int a=Edge[i].f.f;int b=Edge[i].f.s;int w=Edge[i].s.f; BLOCK=i; vi d1,d2; S[b].pb(a,mp(w,0)); dijkstra(1,S,d1);dijkstra(N,S,d2); int tw=Edge[i].s.s+d1[N]+d2[1]; // cout<<tw<<'\n'; ans=min(ans,tw); S[b].pop_back(); } 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...