제출 #817909

#제출 시각아이디문제언어결과실행 시간메모리
817909OAleksaCommuter Pass (JOI18_commuter_pass)C++14
31 / 100
367 ms35752 KiB
#include <bits/stdc++.h> //#include "factories.h" //#include "wall.h" #define f first #define s second #define int long long using namespace std; const int maxn = 1e5 + 69; vector<pair<int, int>> g[maxn]; int n, m, s, t, u, v; const int inf = 1e18; vector<int> ds(maxn, inf), dt(maxn, inf); vector<int> du(maxn, inf), dv(maxn, inf); vector<int> in(maxn, inf), out(maxn, inf); vector<int> vis(maxn); vector<tuple<int, int, int>> edges; signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int tt = 1; //cin >> tt; while(tt--) { cin >> n >> m >> s >> t >> u >> v; for(int i = 0;i < m;i++) { int a, b, c; cin >> a >> b >> c; g[a].push_back({b, c}); g[b].push_back({a, c}); edges.push_back({a, b, c}); } ds[s] = dt[t] = du[u] = dv[v] = 0; priority_queue<pair<int, int>> pq; pq.push({0, s}); while(!pq.empty()) { auto u = pq.top(); pq.pop(); for(auto v : g[u.s]) { if(ds[v.f] <= ds[u.s] + v.s) continue; ds[v.f] = ds[u.s] + v.s; pq.push({-ds[v.f], v.f}); } } pq.push({0, t}); while(!pq.empty()) { auto u = pq.top(); pq.pop(); for(auto v : g[u.s]) { if(dt[v.f] <= dt[u.s] + v.s) continue; dt[v.f] = dt[u.s] + v.s; pq.push({-dt[v.f], v.f}); } } pq.push({0, u}); while(!pq.empty()) { auto u = pq.top(); pq.pop(); for(auto v : g[u.s]) { if(du[v.f] <= du[u.s] + v.s) continue; du[v.f] = du[u.s] + v.s; pq.push({-du[v.f], v.f}); } } pq.push({0, v}); while(!pq.empty()) { auto u = pq.top(); pq.pop(); for(auto v : g[u.s]) { if(dv[v.f] <= dv[u.s] + v.s) continue; dv[v.f] = dv[u.s] + v.s; pq.push({-dv[v.f], v.f}); } } vector<pair<int, int>> v; for(int i = 1;i <= n;i++) v.push_back({du[i], i}); sort(v.begin(), v.end()); function<void(int)> dfs = [&](int v) { vis[v] = true; for(auto u : g[v]) { if(!vis[u.f] && (ds[u.f] + dt[v] + u.s == ds[t] || ds[v] + dt[u.f] + u.s == ds[t])) { in[u.f] = in[v]; dfs(u.f); } } }; for(int i = 0;i < n;i++) { if(!vis[v[i].s]) { in[v[i].s] = v[i].f; dfs(v[i].s); } } v.clear(); for(int i = 1;i <= n;i++) { v.push_back({dv[i], i}); vis[i] = false; } sort(v.begin(), v.end()); function<void(int)> dfs1 = [&](int v) { vis[v] = true; for(auto u : g[v]) { if(!vis[u.f] && (ds[u.f] + dt[v] + u.s == ds[t] || ds[v] + dt[u.f] + u.s == ds[t])) { out[u.f] = out[v]; dfs1(u.f); } } }; for(int i = 0;i < n;i++) { if(!vis[v[i].s]) { out[v[i].s] = v[i].f; dfs1(v[i].s); } } int ans = inf; for(int i = 1;i <= n;i++) ans = min(ans, in[i] + out[i]); cout << ans; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...