Submission #527607

#TimeUsernameProblemLanguageResultExecution timeMemory
527607LoboOlympic Bus (JOI20_ho_t4)C++17
0 / 100
107 ms3528 KiB
#include<bits/stdc++.h> using namespace std; const long long inf = (long long) 1e18 + 10; const int inf1 = (int) 1e9 + 10; #define int long long #define dbl long double #define endl '\n' #define sc second #define fr first #define mp make_pair #define pb push_back #define all(x) x.begin(), x.end() #define maxn 210 #define maxm 50010 int n, m, d[maxn][maxn], dx1[maxn][maxn], dxn[maxn][maxn]; pair<int,int> mn1[maxn], mnn[maxn]; int u[maxm], v[maxm], c[maxm], up[maxm]; vector<int> g[maxn]; void shpx1(int x) { for(int i = 1; i <= n; i++) { dx1[x][i] = inf; } if(x == 1) return; priority_queue<pair<int,int>> pq; pq.push(mp(0,1)); dx1[x][1] = 0; while(pq.size()) { int a = pq.top().sc; int dist = -pq.top().fr; pq.pop(); if(dist != dx1[x][a]) continue; for(auto i : g[a]) { int b = v[i]; int w = c[i]; if(b == x) continue; if(dx1[x][b] > dx1[x][a] + w) { dx1[x][b] = dx1[x][a] + w; pq.push(mp(-dx1[x][b],b)); } } } } void shpxn(int x) { for(int i = 1; i <= n; i++) { dxn[x][i] = inf; } if(x == n) return; priority_queue<pair<int,int>> pq; pq.push(mp(0,n)); dxn[x][n] = 0; while(pq.size()) { int a = pq.top().sc; int dist = -pq.top().fr; pq.pop(); if(dist != dxn[x][a]) continue; for(auto i : g[a]) { int b = v[i]; int w = c[i]; if(b == x) continue; if(dxn[x][b] > dxn[x][a] + w) { dxn[x][b] = dxn[x][a] + w; pq.push(mp(-dxn[x][b],b)); } } } } void solve() { cin >> n >> m; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { d[i][j] = inf; } d[i][i] = 0; } for(int i = 1; i <= m; i++) { cin >> u[i] >> v[i] >> c[i] >> up[i]; g[u[i]].pb(i); d[u[i]][v[i]] = min(d[u[i]][v[i]],c[i]); } for(int k = 1; k <= n; k++) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { d[i][j] = min(d[i][j],d[i][k]+d[k][j]); } } } for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { // cout << i << " " << j << " " << d[i][j] << endl; } } //tenho que pegar dx1 e dxn for(int i = 1; i <= n; i++) { shpx1(i); shpxn(i); } //pegar o menor/segundo menor de cada cara for(int a = 1; a <= n; a++) { mn1[a] = mp(inf,inf); if(a == n) mn1[a] = mp(0,inf); for(auto i : g[a]) { int b = v[i]; // cout << " " << a << " " << b << endl; mn1[a].sc = min(mn1[a].sc, d[1][a] + c[i] + d[b][n]); if(mn1[a].sc < mn1[a].fr) swap(mn1[a].fr,mn1[a].sc); } // cout << a << " " << mn1[a].fr << " " << mn1[a].sc << endl; } for(int a = 1; a <= n; a++) { mnn[a] = mp(inf,inf); if(a == 1) mnn[a] = mp(0,inf); for(auto i : g[a]) { int b = v[i]; mnn[a].sc = min(mnn[a].sc, d[n][a] + c[i] + d[b][1]); if(mnn[a].sc < mnn[a].fr) swap(mnn[a].fr,mnn[a].sc); } } int ans = inf; ans = min(ans, d[1][n]+d[n][1]); //usa no 1->n for(int i = 1; i <= m; i++) { int ans1 = 0; if(d[n][1] == d[n][u[i]] + c[i] + d[v[i]][1]) { ans1 = min(dxn[u[i]][1], mnn[u[i]].sc); } else { ans1 = d[n][1]; } ans1+= d[1][v[i]]+c[i]+up[i]+d[u[i]][n]; ans = min(ans,ans1); } //usa no n->1 for(int i = 1; i <= m; i++) { int ans1 = 0; if(d[1][n] == d[1][u[i]] + c[i] + d[v[i]][n]) { ans1 = min(dx1[u[i]][n], mn1[u[i]].sc); } else { ans1 = d[1][n]; } ans1+= d[n][v[i]]+c[i]+up[i]+d[u[i]][1]; ans = min(ans,ans1); } if(ans == inf) cout << -1 << endl; else cout << ans << endl; } int32_t main() { ios::sync_with_stdio(false); cin.tie(0); // freopen("in.in", "r", stdin); //freopen("out.out", "w", stdout); int tt = 1; // cin >> tt; while(tt--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...