Submission #849547

#TimeUsernameProblemLanguageResultExecution timeMemory
849547vjudge1Commuter Pass (JOI18_commuter_pass)C++17
100 / 100
457 ms31480 KiB
#include <bits/stdc++.h> using namespace std; #define NMAX 100000 #define f first #define s second int N, M, S, T, U, V; vector<pair<long long, int> > E[NMAX + 5]; long long res; class state { public: int u; long long d; bool t1, t2; state() { u = 0; d = 0; t1 = t2 = 0; } state(long long _d, int _u, bool _t1, bool _t2) { d = _d; u = _u; t1 = _t1; t2 = _t2; } bool operator < (const state &v) const { return d < v.d; } bool operator == (const state &v) const { return d == v.d; } bool operator > (const state &v) const { return d > v.d; } }; long long d[NMAX + 5][2][2], len[2][NMAX + 5]; int start[2]; priority_queue<state, vector<state>, greater<state> > pq; typedef pair<long long, int> pli; priority_queue<pli, vector<pli>, greater<pli> > pq2; void prepare(int t) { pq2.push({0, start[t]}); len[t][start[t]] = 0; while(pq2.size()) { long long len_u = pq2.top().f; int u = pq2.top().s; pq2.pop(); if(len_u != len[t][u]) continue; for(pair<long long, int> &x : E[u]) { int v = x.s; long long uv = x.f; if(len[t][v] > len[t][u] + uv) { len[t][v] = len[t][u] + uv; pq2.push({len[t][v], v}); } } } } void solve() { memset(d, 0x3f, sizeof d); d[U][0][0] = 0; pq.push(state(0, U, 0, 0)); while(pq.size()) { int u = pq.top().u; long long du = pq.top().d; bool t1 = pq.top().t1; bool t2 = pq.top().t2; pq.pop(); if(du != d[u][t1][t2]) continue; for(pair<long long, int> &x : E[u]) { long long uv = x.f; int v = x.s; if(d[v][t1][0] > d[u][t1][t2] + uv) { d[v][t1][0] = d[u][t1][t2] + uv; pq.push(state(d[v][t1][0], v, t1, 0)); } if(len[0][u] + uv + len[1][v] == len[0][T]) { if(t1 == 1 && t2 == 0) continue; if(d[v][1][1] > d[u][t1][t2]) { d[v][1][1] = d[u][t1][t2]; pq.push(state(d[v][1][1], v, 1, 1)); } } } } res = min(res, min(d[V][1][1], d[V][1][0])); res = min(res, d[V][0][0]); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); if(fopen("BUS.INP", "r")) { freopen("BUS.INP", "r", stdin); freopen("BUS.OUT", "w", stdout); } cin >> N >> M >> S >> T >> U >> V; for(int i = 1; i <= M; i++) { int u, v; long long w; cin >> u >> v >> w; E[u].push_back({w, v}); E[v].push_back({w, u}); } start[0] = S; start[1] = T; memset(len, 0x3f, sizeof len); for(int i = 0; i < 2; i++) prepare(i); res = 1e18; solve(); swap(U, V); solve(); cout << res; }

Compilation message (stderr)

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