제출 #202608

#제출 시각아이디문제언어결과실행 시간메모리
202608dndhkOlympic Bus (JOI20_ho_t4)C++14
11 / 100
169 ms3576 KiB
#include <bits/stdc++.h> #define pb push_back using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const int MAX_N = 200; const int MAX_M = 50000; const ll INF = 1e14; int N, M; vector<pii> gp[2][MAX_N+1]; int u[MAX_M+1], v[MAX_M+1]; ll d[MAX_M+1], c[MAX_M+1]; ll dp[2][2][MAX_N+1]; ll ans; vector<int> vt; int ST; priority_queue<pll, vector<pll>, greater<pll> > pq; bool vst[MAX_N+1]; int from[MAX_N+1]; void solve(int x, int y){ for(int i=1; i<=N; i++){ dp[x][y][i] = INF; vst[i] = false; from[i] = 0; } dp[x][y][ST] = 0; pq.push({0LL, (ll)ST}); while(!pq.empty()){ pll now = pq.top(); pq.pop(); if(vst[now.second]) continue; vst[now.second] = true; if(from[now.second]!=0){ vt.pb(from[now.second]); } for(pii p : gp[x][now.second]){ if(dp[x][y][p.first]>dp[x][y][now.second] + c[p.second]){ from[p.first] = now.second; dp[x][y][p.first] = dp[x][y][now.second] + c[p.second]; pq.push({dp[x][y][p.first], p.first}); } } } } bool chk[MAX_M+1]; vector<pii> gp2[MAX_N+1]; ll dp2[MAX_N+1], dp3[MAX_N+1]; void solve2(int x){ for(int i=1; i<=N; i++){ while(!gp2[i].empty()) gp2[i].pop_back(); dp2[i] = dp3[i] = INF; vst[i] = false; } for(int i=1; i<=M; i++){ if(i!=x){ gp2[u[i]].pb({v[i], (int)c[i]}); }else{ gp2[v[i]].pb({u[i], (int)c[i]}); } } pq.push({0LL, 1LL}); dp2[1] = 0; while(!pq.empty()){ pll now = pq.top(); pq.pop(); if(vst[now.second]) continue; vst[now.second] = true; for(pii p : gp2[now.second]){ if(dp2[p.first]>dp2[now.second] + (ll)p.second){ dp2[p.first] = dp2[now.second] + (ll)p.second; pq.push({dp2[p.first], p.first}); } } } for(int i=1; i<=N; i++) vst[i] = false; pq.push({0LL, (ll)N}); dp3[N] = 0; while(!pq.empty()){ pll now = pq.top(); pq.pop(); if(vst[now.second]) continue; vst[now.second] = true; for(pii p : gp2[now.second]){ if(dp3[p.first]>dp3[now.second] + (ll)p.second){ dp3[p.first] = dp3[now.second] + (ll)p.second; pq.push({dp3[p.first], p.first}); } } } //cout<<x<<" "<<dp2[N]<<" "<<dp3[1]<<" "<<d[x]<<endl; ans = min(ans, dp2[N] + dp3[1] + d[x]); } int main(){ scanf("%d%d", &N, &M); for(int i=1; i<=M; i++){ scanf("%d%d%lld%lld", &u[i], &v[i], &c[i], &d[i]); gp[0][u[i]].pb({v[i], i}); gp[1][v[i]].pb({u[i], i}); } ST = 1; solve(0, 0); ST = N; solve(0, 1); ST = 1; solve(1, 0); ST = N; solve(1, 1); ans = dp[0][0][N] + dp[0][1][1]; for(int i : vt){ if(!chk[i]){ solve2(i); chk[i] = true; } } /*for(int i=0; i<2; i++){ for(int j=0; j<2; j++){ for(int k=1; k<=N; k++){ cout<<dp[i][j][k]<<" "; } cout<<endl; } }*/ for(int i=1; i<=M; i++){ if(!chk[i]){ //solve2(i); ll dist = d[i]; if(dp[0][0][u[i]]<=dp[0][0][v[i]]) dist+=dp[0][0][N]; else dist+=min(dp[0][0][N], dp[0][0][v[i]] + c[i] + dp[1][1][u[i]]); if(dp[0][1][u[i]]<=dp[0][1][v[i]]) dist+=dp[0][1][1]; else dist+=min(dp[0][1][1], dp[0][1][v[i]] + c[i] + dp[1][0][u[i]]); // cout<<u[i]<<" "<<v[i]<<" "<<c[i]<<" "<<d[i]<<endl; // cout<<dp[0][0][v[i]]<<" "<<dp[1][1][u[i]]<<" "<<dp[0][1][v[i]]<<" "<<dp[1][0][u[i]]<<endl; ans = min(ans, dist); } } if(ans>=INF){ printf("-1"); }else{ printf("%lld\n", ans); } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

ho_t4.cpp: In function 'int main()':
ho_t4.cpp:108:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d", &N, &M);
  ~~~~~^~~~~~~~~~~~~~~~
ho_t4.cpp:110:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%lld%lld", &u[i], &v[i], &c[i], &d[i]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...