제출 #1311670

#제출 시각아이디문제언어결과실행 시간메모리
1311670krasnal738Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
666 ms82336 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long struct edge{ int u, v; ll w; void wczyt(){ cin >> u >> v >> w; } void print(){ cerr << u << ' ' << v << ' ' << w << '\n'; } }; const int MAXN = 1e5 + 7; const ll inf = 1e18; ll odl_s[MAXN], odl_t[MAXN], odl_u[4 * MAXN]; void dijkstra(int start, ll odl[], vector<vector<pair<ll, int>>> &graf){ priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq; pq.push({0, start}); while(!pq.empty()){ auto [cost, v] = pq.top(); // cerr << "v: " << v << " cost: " << cost << '\n'; pq.pop(); if(odl[v] != inf) continue; odl[v] = cost; for(auto [u, w] : graf[v]){ // cerr << "u: " << u << " w: " << w << "\n"; if(odl[u] == inf) pq.push({cost + w, u}); } } // cerr << "###################\n"; } void which_edges(int s, int t, vector<edge> &edges, vector<edge> &vec){ for(auto [u, v, w] : edges){ if(odl_s[u] + w + odl_t[v] == odl_s[t]) vec.push_back({u, v, 0}); if(odl_s[v] + w + odl_t[u] == odl_s[t]) vec.push_back({v, u, 0}); } } void build_graf(vector<vector<pair<ll, int>>> &graf, vector<edge> &git){ int n = graf.size() / 4; for(auto [u, v, w] : git){ graf[n + u].push_back({n + v, w}); graf[2 * n + v].push_back({2 * n + u, w}); } } int main(){ int n, m, s, t, u, v; cin >> n >> m >> s >> t >> u >> v; vector<vector<pair<ll, int>>> graf(n + 1), graf2(4 * n + 1); for(int i = 1; i <= n; i++){ graf2[i].push_back({n + i, 0}); graf2[i].push_back({2 * n + i, 0}); graf2[n + i].push_back({3 * n + i, 0}); graf2[2 * n + i].push_back({3 * n + i, 0}); odl_s[i] = inf; odl_t[i] = inf; // odl_u[i] = inf; } fill(odl_u, odl_u + 4 * MAXN, inf); vector<edge> edges(m); for(edge &e : edges){ e.wczyt(); graf[e.u].push_back({e.v, e.w}); graf[e.v].push_back({e.u, e.w}); graf2[e.u].push_back({e.v, e.w}); graf2[e.v].push_back({e.u, e.w}); graf2[3 * n + e.u].push_back({3 * n + e.v, e.w}); graf2[3 * n + e.v].push_back({3 * n + e.u, e.w}); } dijkstra(s, odl_s, graf); dijkstra(t, odl_t, graf); vector<edge> git; which_edges(s, t, edges, git); build_graf(graf2, git); dijkstra(u, odl_u, graf2); cout << odl_u[3 * n + v] << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...