Submission #1283044

#TimeUsernameProblemLanguageResultExecution timeMemory
1283044anhphantCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
2096 ms17452 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll N, M, S, T, U, V; struct edge { ll v, w; edge() { v = w = 0; } edge(ll v_, ll w_) { v = v_; w = w_; } }; vector<edge> GR[200007]; ll dist[200007], visited[200007], dist2[200007]; set<pair<ll, ll>> config; ll dijsktra() { for(int i = 0; i <= N; ++i) { dist2[i] = 1e18; visited[i] = 0; } struct cmp { bool operator () (ll x1, ll x2) { return dist2[x1] > dist2[x2]; } }; priority_queue<ll, vector<ll>, cmp> heap; dist2[U] = 0; heap.push(U); while(!heap.empty()) { ll u = heap.top(); heap.pop(); if (visited[u]) continue; visited[u] = 1; for(auto tmp : GR[u]) { ll v = tmp.v; ll w = tmp.w; if (config.count({u, v}) || config.count({v, u})) w = 0; if (dist2[v] > dist2[u] + w) { dist2[v] = dist2[u] + w; heap.push(v); } } } return dist2[V]; } int main() { ios_base :: sync_with_stdio(0); cin.tie(0); cout.tie(0); cerr.tie(0); if (fopen("test.inp", "r")) { freopen("test.inp", "r", stdin); freopen("test.ans", "w", stdout); } cin >> N >> M >> S >> T >> U >> V; for(int i = 1; i <= M; ++i) { ll u, v, c; cin >> u >> v >> c; GR[u].push_back(edge(v, c)); GR[v].push_back(edge(u, c)); } for(int i = 0; i <= N; ++i) dist[i] = 1e18; dist[S] = 0; struct cmp { bool operator () (ll x1, ll x2) { return dist[x1] > dist[x2]; } }; priority_queue<ll, vector<ll>, cmp> heap; heap.push(S); while(!heap.empty()) { ll u = heap.top(); heap.pop(); if (visited[u]) continue; visited[u] = 1; for(auto tmp : GR[u]) { ll v = tmp.v; ll w = tmp.w; if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; heap.push(v); } } } //for(int i = 1; i <= N; ++i) cerr << dist[i] << " "; cerr << '\n'; ll ans = 1e18; auto dfs = [&](auto&& self, ll u) { //cerr << u << " " << dist[u] << '\n'; if (u == S) { ans = min(ans, dijsktra()); return; } for(auto tmp : GR[u]) { ll v = tmp.v; ll w = tmp.w; if (dist[v] == dist[u] - w) { config.insert({u, v}); self(self, v); config.erase({u, v}); } } }; dfs(dfs, T); cout << ans; }

Compilation message (stderr)

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