제출 #475717

#제출 시각아이디문제언어결과실행 시간메모리
475717CodeChamp_SSCommuter Pass (JOI18_commuter_pass)C++17
100 / 100
951 ms35980 KiB
#include<bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; #define ff first #define ss second #define pb push_back #define eb emplace_back #define mp make_pair #define lb lower_bound #define ub upper_bound #define setbits(x) __builtin_popcountll(x) #define zrobits(x) __builtin_ctzll(x) #define sz(v) (int)v.size() #define ps(y) cout << fixed << setprecision(y) #define ms(arr, v) memset(arr, v, sizeof(arr)) #define all(v) v.begin(), v.end() #define rall(v) v.rbegin(), v.rend() #define trav(x, v) for(auto &x: v) #define w(t) int t; cin >> t; while(t--) #define rep(i, a, b) for(int i = a; i <= b; i++) #define rrep(i, a, b) for(int i = a; i >= b; i--) #define rep0(i, n) rep(i, 0, n - 1) #define rrep0(i, n) rrep(i, n - 1, 0) #define rep1(i, n) rep(i, 1, n) #define rrep1(i, n) rrep(i, n, 1) #define inp(arr, n) rep0(i, n) cin >> arr[i]; typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef pair<ll, ll> pii; typedef vector<ll> vi; typedef vector<vi> vvi; typedef vector<pii> vp; typedef vector<bool> vb; typedef vector<string> vs; typedef map<ll, ll> mii; typedef map<char, ll> mci; typedef priority_queue<ll> pq_mx; typedef priority_queue<vi, vvi, greater<>> pq_mn; typedef tree<ll, null_type, less<>, rb_tree_tag, tree_order_statistics_node_update> pbds; /* * find_by_order(i) -> returns an iterator to the element at ith position (0 based) * order_of_key(i) -> returns the position of element i (0 based) */ const int N = 2e5 + 5; const int mod = 1e9 + 7; //const int mod = 998244353; const ll inf = 1e18; const double eps = 1e-10; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); void fio() { ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); } int n, m, S, T, U, V; ll dp[2][N], res; vi du, dv; vp gr[N]; vi dijkstra(int src) { vi dist(n + 1, inf); dist[src] = 0; set<pii> q; q.emplace(0, src); while (!q.empty()) { auto[d, cur] = *q.begin(); q.erase(q.begin()); trav(neigh, gr[cur]) { if (dist[neigh.ff] > d + neigh.ss) { auto it = q.find({dist[neigh.ff], neigh.ff}); if (it != q.end()) q.erase(it); dist[neigh.ff] = d + neigh.ss, q.emplace(dist[neigh.ff], neigh.ff); } } } return dist; } void f(ll s, ll e) { rep0(i, 2) { rep0(x, n + 1) dp[i][x] = inf; } vi dist(n + 1, inf); vb vis(n + 1, false); pq_mn q; q.push({0, s, 0}); while (!q.empty()) { vi v = q.top(); q.pop(); ll d = v[0], cur = v[1], par = v[2]; if (!vis[cur]) { vis[cur] = true, dist[cur] = d; dp[0][cur] = min(du[cur], dp[0][par]); dp[1][cur] = min(dv[cur], dp[1][par]); trav(neigh, gr[cur]) q.push({d + neigh.ss, neigh.ff, cur}); } else if (dist[cur] == d) { if (min(dp[0][par], du[cur]) + min(dp[1][par], dv[cur]) <= dp[0][cur] + dp[1][cur]) { dp[0][cur] = min(du[cur], dp[0][par]); dp[1][cur] = min(dv[cur], dp[1][par]); } } } res = min(res, dp[0][e] + dp[1][e]); } int main() { fio(); cin >> n >> m >> S >> T >> U >> V; rep0(x, m) { int u, v, w; cin >> u >> v >> w; gr[u].eb(v, w), gr[v].eb(u, w); } du = dijkstra(U), dv = dijkstra(V); res = du[V]; f(S, T), f(T, S); cout << res; 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...