제출 #716961

#제출 시각아이디문제언어결과실행 시간메모리
716961Dan4LifeMuseum (CEOI17_museum)C++17
80 / 100
1320 ms1048576 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define sz(a) (int)a.size() #define all(a) a.begin(),a.end() const int mxN=(int)1e4+10; const int LINF = (int)1e9; int n, k, s, sub[mxN]; vector<pair<int,int>> adj[mxN]; int dp[mxN][mxN][2], dp2[mxN][mxN][2]; int findSize(int s, int p){ sub[s]=1; for(auto [u,w] : adj[s]) if(u!=p) sub[s]+=findSize(u,s); return sub[s]; } void dfs(int s, int p){ vector<pair<int,int>> v; v.clear(); for(auto [u,w] : adj[s]) if(u!=p) dfs(u,s), v.pb({u,w}); dp[s][1][0]=dp[s][1][1]=0; if(!sz(v)) return; for(int i = 0; i <= sz(v); i++) for(int j = 0; j <= k; j++) dp2[i][j][0]=dp2[i][j][1]=LINF; dp2[0][0][0] = dp2[0][0][1] = 0; int tot = 1; for(int i = 1; i <= sz(v); i++){ auto u = v[i-1].fi; tot+=sub[u]; for(int j = 0; j <= k; j++){ for(int x = 0; x < 2; x++){ dp2[i][j][x] = min(dp2[i][j][x],dp2[i-1][j][x]); for(int l = max(1,j-tot+sub[u]); l <= min(j,sub[u]); l++){ dp2[i][j][x] = min(dp2[i][j][x], dp2[i-1][j-l][x]+dp[u][l][1]+2*v[i-1].se); if(!x)dp2[i][j][x] = min(dp2[i][j][x], dp2[i-1][j-l][1]+dp[u][l][0]+v[i-1].se); } } } } for(int i = 2; i <= k; i++) for(int j = 0; j < 2; j++) dp[s][i][j] = min(dp[s][i][j],dp2[sz(v)][i-1][j]); } int32_t main() { ios_base::sync_with_stdio(false); cin.tie(0); cin >> n >> k >> s; for(int i = 0; i < mxN; i++) for(int j = 0; j < mxN; j++) dp[i][j][0]=dp[i][j][1]=LINF; for(int i = 1; i < n; i++){ int a, b, c; cin >> a >> b >> c; adj[a].pb({b,c}), adj[b].pb({a,c}); } findSize(s,-1); dfs(s,-1); cout << dp[s][k][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...