Submission #1265607

#TimeUsernameProblemLanguageResultExecution timeMemory
1265607Hamed_GhaffariLOSTIKS (INOI20_lostiks)C++20
100 / 100
939 ms405848 KiB
#include <bits/stdc++.h> using namespace std; #define mins(a, b) (a = min(a, b)) const int MXN = 1e6+5, MXM = 21, inf = 1e9; int n, s, t, U[MXN], V[MXN], W[MXN], key[MXM], door[MXM], par[MXM][MXN], h[MXN], dis[MXM][MXM]; int mask[MXN], dp[MXM][1<<MXM], timer, dest[MXM]; vector<int> g[MXN]; void dfs(int v) { for(int i=1; i<MXM; i++) par[i][v] = par[i-1][par[i-1][v]]; for(int i : g[v]) { int u = v^U[i]^V[i]; if(u==par[0][v]) continue; par[0][u] = v; h[u] = h[v]+1; mask[u] = mask[v]; if(W[i]!=-1) { door[W[i]] = v; mask[u] |= 1<<W[i]; } dfs(u); } } inline int jump(int v, int d) { for(int i=0; i<MXM; i++) if(d>>i&1) v = par[i][v]; return v; } inline int LCA(int u, int v) { if(h[u]<h[v]) swap(u, v); u = jump(u, h[u]-h[v]); if(u==v) return u; for(int i=MXM-1; i>=0; i--) if(par[i][u]!=par[i][v]) u = par[i][u], v = par[i][v]; return par[0][u]; } void DP(int v, int msk) { if(dp[v][msk] != -1) return; if(!(mask[t] & msk)) { dp[v][msk] = dest[v]; return; } dp[v][msk] = inf; for(int i=0; i<timer; i++) if(msk>>i&1) if(!((mask[key[i]]|mask[door[i]]) & msk)) { DP(i, msk^(1<<i)); mins(dp[v][msk], dp[i][msk^(1<<i)] + dis[v][i]); } } int32_t main() { cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0); cin >> n >> s >> t; for(int i=0; i<n-1; i++) { cin >> U[i] >> V[i] >> W[i]; if(W[i]==0) W[i] = -1; else key[W[i]=timer++] = W[i]; g[U[i]].push_back(i); g[V[i]].push_back(i); } door[timer] = s; dfs(s); for(int i=0; i<=timer; i++) { for(int j=0; j<timer; j++) if(i^j) dis[i][j] = h[door[i]] + 2*h[key[j]] + h[door[j]] - 2*h[LCA(door[i], key[j])] - 2*h[LCA(key[j], door[j])]; dest[i] = h[door[i]] + h[t] - 2*h[LCA(door[i], t)]; } memset(dp, -1, sizeof(dp)); DP(timer, (1<<timer)-1); cout << (dp[timer][(1<<timer)-1]==inf ? -1 : dp[timer][(1<<timer)-1]) << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...