Submission #1311709

#TimeUsernameProblemLanguageResultExecution timeMemory
1311709dex111222333444555Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
208 ms19404 KiB
#include <bits/stdc++.h> #define all(v) begin(v), end(v) #define siz(v) (int)(v).size() #define ii pair<int, int> #define ill pair<int, long long> #define lli pair<long long, int> #define fi first #define se second using namespace std; template<class X, class Y> bool maximize(X &x, const Y &y){return x < y ? x = y, 1: 0;} template<class X, class Y> bool minimize(X &x, const Y &y){return x > y ? x = y, 1: 0;} const int MAXN = 1e5 + 5; const long long inf = 1e18 + 234; struct E{ int u, v, w; E(int _u = 0, int _v = 0, int _w = 0): u(_u), v(_v), w(_w) {}; int other(int x){ return u ^ v ^ x; } }; int numNode, numEdge, in[MAXN], S, T, U, V; long long distS[MAXN], distT[MAXN], distU[MAXN], distV[MAXN], dpU[MAXN], dpV[MAXN]; vector<int> adj[MAXN], nadj[MAXN]; E edge[MAXN << 1]; void input(){ cin >> numNode >> numEdge; cin >> S >> T >> U >> V; for(int i = 1; i <= numEdge; i++){ int u, v, w; cin >> u >> v >> w; adj[u].push_back(i); adj[v].push_back(i); edge[i] = E(u, v, w); } } void dijsktra(long long *dist, const int &source){ priority_queue<lli, vector<lli>, greater<lli> > q; memset(dist, 0x3f, (numNode + 1) * sizeof(long long)); q.push(lli(dist[source] = 0, source)); while(q.size()){ long long len = q.top().fi; int u = q.top().se; q.pop(); if (len > dist[u]) continue; for(int id: adj[u]){ int v = edge[id].other(u); if (minimize(dist[v], dist[u] + edge[id].w)) q.push(lli(dist[v], v)); } } } bool valid(int u, int v, int w){ if (distS[u] + w + distT[v] == distS[T]) return 1; return 0; } void addEdge(int u, int v){ nadj[u].push_back(v); in[v]++; } void solve(){ dijsktra(distS, S); dijsktra(distT, T); dijsktra(distU, U); dijsktra(distV, V); for(int i = 1; i <= numEdge; i++){ int u = edge[i].u, v = edge[i].v, w = edge[i].w; if (valid(u, v, w)) addEdge(u, v); if (valid(v, u, w)) addEdge(v, u); } memset(dpU, 0x3f, sizeof dpU); memset(dpV, 0x3f, sizeof dpV); long long res = inf; queue<int> q; for(int u = 1; u <= numNode; u++) if (!in[u]) q.push(u); while(q.size()){ int u = q.front(); q.pop(); minimize(dpU[u], distU[u]); minimize(dpV[u], distV[u]); minimize(res, dpU[u] + distV[u]); minimize(res, dpV[u] + distU[u]); for(int v: nadj[u]){ minimize(dpU[v], dpU[u]); minimize(dpV[v], dpV[u]); if (--in[v] == 0){ q.push(v); } } } cout << res << '\n'; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define task "test" if (fopen(task".inp","r")){ freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } input(); solve(); }

Compilation message (stderr)

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:118:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  118 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:119:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  119 |         freopen(task".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...