Submission #1200662

#TimeUsernameProblemLanguageResultExecution timeMemory
120066212345678Training (IOI07_training)C++20
100 / 100
7 ms4680 KiB
#include <bits/stdc++.h> using namespace std; const int nx=1e3+5, kx=10; int n, m, u, v, w, dp[nx][1<<kx], lvl[nx], pa[nx][kx], idx[nx], sz[nx], res; vector<int> d[nx]; vector<tuple<int, int, int>> edg, event[nx]; void dfs(int u, int p) { lvl[u]=lvl[p]+1; pa[u][0]=p; for (int i=1; i<kx; i++) pa[u][i]=pa[pa[u][i-1]][i-1]; for (auto v:d[u]) if (v!=p) idx[v]=sz[u]++, dfs(v, u); } int lca(int u, int v) { if (lvl[u]>lvl[v]) swap(u, v); for (int i=kx-1; i>=0; i--) if (lvl[pa[v][i]]>=lvl[u]) v=pa[v][i]; if (u==v) return u; for (int i=kx-1; i>=0; i--) if (pa[u][i]!=pa[v][i]) u=pa[u][i], v=pa[v][i]; return pa[u][0]; } void solve(int u, int p) { for (auto v:d[u]) if (v!=p) solve(v, u), dp[u][1<<idx[v]]=dp[v][(1<<sz[v])-1]; for (auto [cu, cv, cw]:event[u]) { int umsk=0, sm=0, pv=-1; while (cu!=u) { int msk=(1<<sz[cu])-1; if (pv!=-1) msk^=(1<<idx[pv]); pv=cu; sm+=dp[cu][msk]; if (pa[cu][0]==u) umsk^=(1<<idx[cu]); cu=pa[cu][0]; } pv=-1; while (cv!=u) { int msk=(1<<sz[cv])-1; if (pv!=-1) msk^=(1<<idx[pv]); pv=cv; sm+=dp[cv][msk]; if (pa[cv][0]==u) umsk^=(1<<idx[cv]); cv=pa[cv][0]; } dp[u][umsk]=max(dp[u][umsk], sm+cw); } for (int msk=0; msk<(1<<sz[u]); msk++) for (int j=msk; j>0; j=(j-1)&msk) dp[u][msk]=max(dp[u][msk], dp[u][j]+dp[u][msk^j]); } int main() { cin.tie(NULL)->sync_with_stdio(false); cin>>n>>m; for (int i=1; i<=m; i++) { cin>>u>>v>>w; if (!w) d[u].push_back(v), d[v].push_back(u); else edg.push_back({u, v, w}); } dfs(1, 1); for (auto [u, v, w]:edg) { if ((lvl[u]+lvl[v]-2*lvl[lca(u, v)])%2) res+=w; else event[lca(u, v)].push_back({u, v, w}), res+=w; } solve(1, 1); cout<<res-dp[1][(1<<sz[1])-1]; }
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...