Submission #1153062

#TimeUsernameProblemLanguageResultExecution timeMemory
1153062sunflowerCommuter Pass (JOI18_commuter_pass)C++17
55 / 100
151 ms16904 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define FOR(i, a, b) for (int i = (a); i <= (b); ++i) #define debug(x) cout << "[" << #x << " = " << (x) << "]" << endl #define fi first #define se second typedef pair <long long, int> pli; template <class X, class Y> bool minimize(X &x, Y y) { if (x > y) return x = y, true; else return false; } const long long INF = (long long) 1e18 + 7; int numNode, numEdge, S, T, U, V; #define MAX_EDGE 200'200 struct Edge { int u, v, w; Edge(int _u = 0, int _v = 0, int _w = 0) { u = _u, v = _v, w = _w; } void input() { cin >> u >> v >> w; } } edges[MAX_EDGE + 2]; #define MAX_NODE 100'100 vector <pair <int, int>> adj[MAX_NODE + 2]; vector <ll> Dijkstra(int s) { vector <ll> dist(numNode + 2, INF); dist[s] = 0; priority_queue <pli, vector <pli>, greater <pli>> q; #define PUSH(s) q.push({dist[s], s}) PUSH(s); while (!q.empty()) { ll cost = q.top().fi; int u = q.top().se; q.pop(); if (cost > dist[u]) continue; for (const pair <int, int> &e : adj[u]) { int v = e.fi, w = e.se; if (minimize(dist[v], dist[u] + w)) { PUSH(v); } } } return dist; } namespace subtask1 { bool check() { return (S == U); } void solve() { vector <ll> sta_s = Dijkstra(S), sta_t = Dijkstra(T); vector <ll> sta_v = Dijkstra(V); ll res = sta_v[U]; FOR(tmp, 1, numNode) { if (sta_s[tmp] + sta_t[tmp] == sta_s[T]) minimize(res, sta_v[tmp]); } cout << res; } } namespace subtask3 { bool check() { return (numNode <= 300); } ll dist[310][310]; void solve() { // floyd algorithm; memset(dist, 0x3f, sizeof(dist)); FOR(i, 1, numNode) dist[i][i] = 0; FOR(i, 1, numEdge) { int u = edges[i].u, v = edges[i].v, w = edges[i].w; minimize(dist[u][v], w); minimize(dist[v][u], w); } // process floyd; FOR(tmp, 1, numNode) { FOR(u, 1, numNode) FOR(v, u + 1, numNode) { minimize(dist[u][v], dist[u][tmp] + dist[tmp][v]); dist[v][u] = dist[u][v]; } } ll res = dist[U][V]; FOR(tmp_u, 1, numNode) { FOR(tmp_v, 1, numNode) { if (dist[S][tmp_u] + dist[tmp_u][tmp_v] + dist[tmp_v][T] == dist[S][T]) { minimize(res, dist[U][tmp_u] + dist[V][tmp_v]); minimize(res, dist[U][tmp_v] + dist[V][tmp_u]); } } } cout << res; } } namespace subtask2 { void solve() { vector <ll> sta_s = Dijkstra(S), sta_t = Dijkstra(T); FOR(i, 1, numNode) adj[i].clear(); FOR(i, 1, numEdge) { int u = edges[i].u, v = edges[i].v, w = edges[i].w; if (min(sta_s[u] + sta_t[v], sta_s[v] + sta_t[u]) + w == sta_s[T]) w = 0; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } vector <ll> sta_u = Dijkstra(U); cout << sta_u[V]; // exchange V with T } } int main() { ios_base::sync_with_stdio(false);cin.tie(nullptr); if (fopen("test.inp","r")) { freopen("test.inp","r",stdin); freopen("test.out","w",stdout); } cin >> numNode >> numEdge; cin >> S >> T; cin >> U >> V; FOR(i, 1, numEdge) { edges[i].input(); int u = edges[i].u, v = edges[i].v, w = edges[i].w; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } if (subtask1 :: check()) return subtask1 :: solve(), 0; if (subtask3 :: check()) return subtask3 :: solve(), 0; subtask2 :: solve(); return 0; }

Compilation message (stderr)

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:142:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  142 |         freopen("test.inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:143:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  143 |         freopen("test.out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...