제출 #344474

#제출 시각아이디문제언어결과실행 시간메모리
344474eyangchCommuter Pass (JOI18_commuter_pass)C++17
0 / 100
502 ms25820 KiB
#include <bits/stdc++.h> #define int long long using namespace std; int N, M, S, T, U, V; vector<pair<int, int>> graph[100000]; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; int dist[100000], dists[100000], distt[100000], distu[100000], distv[100000]; int dp[100000]; int ans = 1e9; void dij(int start){ pq.push({0, start}); fill(dist, dist+N, 1e17); dist[start] = 0; while(!pq.empty()){ int id = pq.top().second, d = pq.top().first; pq.pop(); if(dist[id] != d){ continue; } for(pair<int, int> i : graph[id]){ if(d + i.second < dist[i.first]){ dist[i.first] = d + i.second; pq.push({dist[i.first], i.first}); } } } } int dfs(int id, int (&dar)[100000]){ if(~dp[id]) return dp[id]; //cout << id << endl; dp[id] = distu[id]; for(pair<int, int> i : graph[id]){ if(dar[i.first] == dar[id] - i.second){ dp[id] = min(dp[id], dfs(i.first, dar)); } } ans = min(ans, dp[id] + distv[id]); return dp[id]; } int32_t main(){ cin >> N >> M >> S >> T >> U >> V; S--, T--, U--, V--; for(int i = 0; i < M; i++){ int a, b, c; cin >> a >> b >> c; graph[a-1].push_back({b-1, c}); graph[b-1].push_back({a-1, c}); } dij(S); copy(dist, dist+N, dists); dij(T); copy(dist, dist+N, distt); dij(U); copy(dist, dist+N, distu); dij(V); copy(dist, dist+N, distv); fill(dp, dp+N, -1); dfs(T, dists); fill(dp, dp+N, -1); dfs(S, distt); cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...