제출 #1178907

#제출 시각아이디문제언어결과실행 시간메모리
1178907MongHwaCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
176 ms13492 KiB
#pragma GCC optimize ("Ofast") #pragma GCC optimize ("unroll-loops") #include <iostream> #include <vector> #include <queue> #include <tuple> #include <set> using namespace std; #define ll long long #define INF 1e17 #define X first #define Y second vector<pair<int, int>> stage[100005]; vector<ll> sdist, udist, vdist; bool status[100005]; priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq; multiset<ll> ums, vms; void dijkstra(vector<ll>& dist, int s) { fill(dist.begin(), dist.end(), INF); dist[s] = 0; pq.push({0, s}); while(!pq.empty()) { ll d; int cur; tie(d, cur) = pq.top(); pq.pop(); if(dist[cur] != d) continue; for(auto& nxt : stage[cur]) if(dist[nxt.X] > d + nxt.Y) { dist[nxt.X] = d + nxt.Y; pq.push({dist[nxt.X], nxt.X}); } } } void dfs(int cur, ll& ans) { status[cur] = 1; ums.insert(udist[cur]); vms.insert(vdist[cur]); ans = min(ans, *ums.begin()+*vms.begin()); for(auto& nxt : stage[cur]) if(sdist[nxt.X] + nxt.Y == sdist[cur] && !status[cur]) dfs(nxt.X, ans); ums.erase(ums.find(udist[cur])); vms.erase(vms.find(vdist[cur])); } int main() { ios::sync_with_stdio(0); cin.tie(0); int n, m, s, t, u, v; cin >> n >> m >> s >> t >> u >> v; while(m--) { int a, b, c; cin >> a >> b >> c; stage[a].push_back({b, c}); stage[b].push_back({a, c}); } sdist.resize(n+1); udist.resize(n+1); vdist.resize(n+1); dijkstra(sdist, s); dijkstra(udist, u); dijkstra(vdist, v); ll ans = udist[v]; ums.insert(udist[s]); vms.insert(vdist[s]); dfs(t, ans); cout << ans << '\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...