제출 #202324

#제출 시각아이디문제언어결과실행 시간메모리
202324amoo_safarOlympic Bus (JOI20_ho_t4)C++14
100 / 100
517 ms3580 KiB
#include <bits/stdc++.h> #define pb push_back #define F first #define S second #define all(x) x.begin(), x.end() #define debug(x) cerr << #x << " : " << x << '\n' using namespace std; typedef long long ll; typedef long double ld; typedef string str; typedef pair<ll, ll> pll; const int N = 2e2 + 10; const int M = 5e4 + 10; const ll Inf = 1e15; ll n, m; ll u[M], v[M], c[M], d[M], ans[M], Gd[M]; ll G[N][N], W[N][N], mk[N], dis[N], dis2[N], par[N]; void Build(){ memset(G, 31, sizeof G); memset(mk, 0, sizeof mk); memset(dis, 31, sizeof dis); memset(dis2, 31, sizeof dis2); memset(W, 0, sizeof W); memset(par, 0, sizeof par); for(int i = 0; i < m; i++){ G[u[i]][v[i]] = min(G[u[i]][v[i]], c[i]); if(G[u[i]][v[i]] == c[i]) W[u[i]][v[i]] = i; } } ll Solve(int idx){ swap(u[idx], v[idx]); Build(); dis[1] = 0; for(int i = 0; i < n; i++){ ll mn = Inf, id = -1; for(int j = 1; j <= n; j++) if(!mk[j] && dis[j] < mn){ mn = dis[j]; id = j; } if(id == -1) break; mk[id] = 1; for(int j = 1; j <= n; j++) if(dis[j] > dis[id] + G[id][j]){ dis[j] = dis[id] + G[id][j]; } } swap(u[idx], v[idx]); return dis[n]; } void Main(){ memset(Gd, 0, sizeof Gd); Build(); dis[1] = 0; for(int i = 0; i < n; i++){ ll mn = Inf, id = -1; for(int j = 1; j <= n; j++) if(!mk[j] && dis[j] < mn){ mn = dis[j]; id = j; } if(id == -1) break; mk[id] = 1; Gd[par[id]] = 1; for(int j = 1; j <= n; j++) if(dis[j] > dis[id] + G[id][j]){ dis[j] = dis[id] + G[id][j]; par[j] = W[id][j]; } } //Build(); memset(mk, 0, sizeof mk); dis2[n] = 0; for(int i = 0; i < n; i++){ ll mn = Inf, id = -1; for(int j = 1; j <= n; j++) if(!mk[j] && dis2[j] < mn){ mn = dis2[j]; id = j; } if(id == -1) break; mk[id] = 1; Gd[par[id]] = 1; for(int j = 1; j <= n; j++) if(dis2[j] > dis2[id] + G[j][id]){ dis2[j] = dis2[id] + G[j][id]; par[j] = W[j][id]; } } for(int i = 0; i < m; i++){ if(!Gd[i]){ ans[i] += min(dis[n], dis[v[i]] + c[i] + dis2[u[i]]); } } for(int i = 0; i < m; i++){ if(Gd[i]){ ans[i] += Solve(i); //cerr << "?? " << i << '\n'; } } return ; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n >> m; for(int i = 0; i < m; i++) cin >> u[i] >> v[i] >> c[i] >> d[i]; ll Ans = Solve(m); Main(); //for(int i = 0; i < m; i++) cout << ans[i] << ' '; //cout << '\n'; for(int i = 0; i < m; i++){ if(u[i] == 1 || u[i] == n) u[i] = n + 1 - u[i]; if(v[i] == 1 || v[i] == n) v[i] = n + 1 - v[i]; } Ans += Solve(m); Main(); for(int i = 0; i < m; i++) Ans = min(Ans, d[i] + ans[i]); //for(int i = 0; i < m; i++) cout << ans[i] << ' '; //cout << '\n'; cout << (Ans < Inf ? Ans : -1) << '\n'; return 0; } /* 4 10 1 2 4 4 1 2 4 4 1 3 2 1 1 3 2 1 4 3 1 2 4 3 1 2 4 1 6 1 4 1 6 1 2 4 2 5 2 4 2 5 4 5 1 2 4 4 1 3 2 1 4 3 1 2 4 1 6 1 2 4 2 5 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...