Submission #964323

#TimeUsernameProblemLanguageResultExecution timeMemory
964323Akshat369Olympic Bus (JOI20_ho_t4)C++17
0 / 100
30 ms6492 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define INF LLONG_MAX #define endl '\n' const int mod = 1000 * 1000 * 1000 + 7; const int N = 205; #define f first #define s second #define rep(i, a, b) for(int i = (a); i < (b); i++) #define rrep(i, a, b) for(int i = (a); i > (b); i--) #define vi vector<int> #define pii pair<int, int> #define all(x) (x).begin(), (x).end() mt19937_64 RNG(chrono::steady_clock::now().time_since_epoch().count()); struct node { int u, v, c, d; }; multiset<pair<int, int>> graph[N]; vector<int> dijkstra(int src) { vector<int> dist(N, INF); vector<int> vis(N, false); dist[src] = 0; priority_queue<pii, vector<pii>, greater<pii>> pq; pq.push({0, src}); while (!pq.empty()) { auto uu = pq.top(); pq.pop(); int u = uu.second; if (vis[u]) continue; vis[u] = true; for (auto& vv : graph[u]) { int v = vv.first; int weight = vv.second; if (dist[v] > dist[u] + weight) { dist[v] = dist[u] + weight; pq.push({dist[v], v}); } } } return dist; } void solve() { int n, m; cin >> n >> m; vector<node> edges(m); for (int i = 0; i < m; ++i) { cin >> edges[i].u >> edges[i].v >> edges[i].c >> edges[i].d; graph[edges[i].u].insert({edges[i].v, edges[i].c}); } vector<vector<int>> dist(n + 1, vector<int>(n + 1, INF)); for (auto& e : edges) { dist[e.u][e.v] = min(dist[e.u][e.v], e.c); } for (int k = 1; k <= n; ++k) { for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); } } } int ans = INF; for (auto& e : edges) { int temp1 = min(dist[1][e.v] + dist[e.u][n] + e.c, dist[1][n]); int temp2 = min(dist[n][e.u] + dist[e.v][1] + e.c, dist[n][1]); if (temp1 + temp2 + e.d < ans) { graph[e.u].erase(graph[e.u].find({e.v, e.c})); graph[e.v].insert({e.u, e.c}); auto dis1 = dijkstra(1); auto dis2 = dijkstra(n); ans = min(ans, dis1[n] + dis2[1] + e.d); graph[e.v].erase(graph[e.v].find({e.u, e.c})); graph[e.u].insert({e.v, e.c}); } } if (ans >= INF) cout << -1 << endl; else cout << ans << endl; } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); int t = 1; // cin >> t; for (int i = 1; i <= t; i++) { // cout << "Case #" << i << ": "; solve(); } 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...