Submission #1173150

#TimeUsernameProblemLanguageResultExecution timeMemory
1173150AtabayRajabliEvacuation plan (IZhO18_plan)C++17
22 / 100
636 ms589824 KiB
#include <bits/stdc++.h> #define int long long #define all(v) v.begin(), v.end() using namespace std; const int sz = 2e5 + 1, inf = 1e18; int n, m, qs, k, cnt, in[sz], out[sz], d[sz], u[sz], v[sz], w[sz], p[sz], dp[18][sz], mn[18][sz], road[sz]; vector<array<int, 2>> g[sz], t[sz]; int par(int x) { if(p[x] < 0) return x; return p[x] = par(p[x]); } bool join(int u, int v) { u = par(u), v = par(v); if(u == v) return 0; if(p[u] > p[v]) swap(u, v); p[u] += p[v]; p[v] = u; return 1; } void dfs(int v, int p) { in[v] = ++cnt; for(auto i : t[v]) { int u = i[0], w = i[1]; if(u == p) continue; road[u] = road[v] + 1; dp[0][u] = v; mn[0][u] = w; dfs(u, v); } out[v] = cnt; } bool anc(int x, int y) { return in[x] <= in[y] && out[y] <= out[x]; } int lca(int u, int v) { if(anc(u, v)) return u; if(anc(v, u)) return v; for(int i = 17; i >= 0; i--) { if(road[u] >= (1 << i) && !anc(dp[i][u], v)) u = dp[i][u]; } return dp[0][u]; } int get(int u, int v) { int cm = lca(u, v); int du = road[u] - road[cm]; int dv = road[v] - road[cm]; int res = inf; for(int i = 0; i < 18; i++) { if((1 << i) & du) { res = min(res, mn[i][u]); u = dp[i][u]; } } for(int i = 0; i < 18; i++) { if((1 << i) & dv) { res = min(res, mn[i][v]); v = dp[i][v]; } } return res; } void solve() { in[0] = inf; cin >> n >> m; for(int i = 1; i <= m; i++) { cin >> u[i] >> v[i] >> w[i]; g[u[i]].push_back({v[i], w[i]}); g[v[i]].push_back({u[i], w[i]}); } set<array<int, 2>> q; fill(d + 1, d + 1 + n, inf); cin >> k; for(int i = 1; i <= k; i++) { int npp; cin >> npp; q.insert({0, npp}); d[npp] = 0; } while(!q.empty()) { int v = (*q.begin())[1]; q.erase(q.begin()); for(auto i : g[v]) { int u = i[0], w = i[1]; if(d[u] > d[v] + w) { q.erase({d[u], u}); d[u] = d[v] + w; q.insert({d[u], u}); } } } vector<array<int, 3>> e; for(int i = 1; i <= m; i++) { w[i] = min(d[u[i]], d[v[i]]); e.push_back({w[i], u[i], v[i]}); } sort(all(e), greater<array<int, 3>>()); fill(p + 1, p + 1 + n, -1); for(auto ex : e) { if(join(ex[1], ex[2])) { t[ex[1]].push_back({ex[2], ex[0]}); t[ex[2]].push_back({ex[1], ex[0]}); } } for(int i = 0; i < 18; i++) for(int j = 1; j <= n; j++) mn[i][j] = inf; dfs(1, 0); for(int i = 1; i < 18; i++) { for(int j = 1; j <= n; j++) { if(road[j] >= (1 << i)) { dp[i][j] = dp[i - 1][dp[i - 1][j]]; mn[i][j] = min(mn[i - 1][j], mn[i - 1][dp[i - 1][j]]); } } } cin >> qs; while(qs--) { int s, t; cin >> s >> t; cout << get(s, t) << '\n'; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int t = 1; // cin >> t; while(t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...