제출 #831161

#제출 시각아이디문제언어결과실행 시간메모리
831161denniskimOlympic Bus (JOI20_ho_t4)C++17
100 / 100
199 ms10160 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef __int128 lll; typedef long double ld; typedef pair<ll, ll> pll; typedef pair<ld, ld> pld; #define MAX 9223372036854775807LL #define MIN -9223372036854775807LL #define INF 0x3f3f3f3f3f3f3f3 / 100 #define fi first #define se second #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cout << fixed; cout.precision(10); #define sp << " " #define en << "\n" #define compress(v) sort(v.begin(), v.end()), v.erase(unique(v.begin(), v.end()), v.end()) struct gujo { ll V, C, D, num; }; ll n, m; ll all, bll, cll, dll; vector< pair<pll, pll> > edg; vector<gujo> vec[210], yuk[210]; ll ans[50010]; ll dist[210][2]; ll dist2[50010][210][2]; ll bk[210][2], bk2[210][2]; ll chk[210], chk2[50010]; ll ans2 = INF, ans3; void dijkstra(ll X) { for(ll i = 1 ; i <= n ; i++) dist[i][0] = INF, bk[i][0] = bk2[i][0] = chk[i] = 0; dist[1][0] = 0; for(ll i = 1 ; i <= n ; i++) { ll minn = INF, w = -1; for(ll j = 1 ; j <= n ; j++) { if(chk[j]) continue; if(minn > dist[j][0]) { minn = dist[j][0]; w = j; } } if(w == -1) break; chk[w] = 1; for(auto &j : vec[w]) { if(j.num == X) continue; if(dist[j.V][0] > dist[w][0] + j.C) { dist[j.V][0] = dist[w][0] + j.C; bk[j.V][0] = w; bk2[j.V][0] = j.num; } } } for(ll i = 1 ; i <= n ; i++) dist[i][1] = INF, bk[i][1] = bk2[i][1] = chk[i] = 0; dist[n][1] = 0; for(ll i = 1 ; i <= n ; i++) { ll minn = INF, w = -1; for(ll j = 1 ; j <= n ; j++) { if(chk[j]) continue; if(minn > dist[j][1]) { minn = dist[j][1]; w = j; } } if(w == -1) break; chk[w] = 1; for(auto &j : yuk[w]) { if(j.num == X) continue; if(dist[j.V][1] > dist[w][1] + j.C) { dist[j.V][1] = dist[w][1] + j.C; bk[j.V][1] = w; bk2[j.V][1] = j.num; } } } for(ll i = 1 ; i <= n ; i++) dist2[X][i][0] = dist[i][0], dist2[X][i][1] = dist[i][1]; } void solve(void) { dijkstra(0); ans3 += dist2[0][n][0]; vector<ll> path; for(ll i = n ; i > 0 ; i = bk[i][0]) path.push_back(bk2[i][0]); for(ll i = 1 ; i <= m ; i++) chk2[i] = 0; for(auto &i : path) { dijkstra(i); chk2[i] = 1; } for(ll i = 1 ; i <= m ; i++) { if(!chk2[i]) ans[i] += min(dist2[0][n][0], dist2[0][edg[i - 1].fi.se][0] + dist2[0][edg[i - 1].fi.fi][1] + edg[i - 1].se.fi); else ans[i] += min(dist2[i][n][0], dist2[i][edg[i - 1].fi.se][0] + dist2[i][edg[i - 1].fi.fi][1] + edg[i - 1].se.fi); } } int main(void) { fastio cin >> n >> m; for(ll i = 1 ; i <= m ; i++) { cin >> all >> bll >> cll >> dll; edg.push_back({{all, bll}, {cll, dll}}); vec[all].push_back({bll, cll, dll, i}); yuk[bll].push_back({all, cll, dll, i}); ans[i] += dll; } solve(); for(ll i = 1 ; i <= n ; i++) { vec[i].clear(); yuk[i].clear(); } ll cc = 0; for(auto &i : edg) { if(i.fi.fi == 1) i.fi.fi = n; else if(i.fi.fi == n) i.fi.fi = 1; if(i.fi.se == 1) i.fi.se = n; else if(i.fi.se == n) i.fi.se = 1; cc++; vec[i.fi.fi].push_back({i.fi.se, i.se.fi, i.se.se, cc}); yuk[i.fi.se].push_back({i.fi.fi, i.se.fi, i.se.se, cc}); } solve(); for(ll i = 1 ; i <= m ; i++) ans2 = min(ans2, ans[i]); ans2 = min(ans2, ans3); if(ans2 >= INF / 10) cout << -1; else cout << ans2; 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...