제출 #604237

#제출 시각아이디문제언어결과실행 시간메모리
604237ziduoMuseum (CEOI17_museum)C++14
100 / 100
468 ms746064 KiB
#include <bits/stdc++.h> using namespace std; #define f first #define s second int n, k, x, cnt[10001], dp[10001][10001][2]; vector<pair<int, int>> edges[10001]; void subSize(int cur, int par){ cnt[cur] = 1; for(pair<int, int> i:edges[cur] ){ if(i.f==par)continue; subSize(i.f, cur); cnt[cur]+=cnt[i.f]; } } void dfs(int cur, int par){ int currSize=1; for(pair<int, int> i: edges[cur]){ if(i.f==par)continue; dfs(i.f, cur); for(int j=currSize; j>=1; j--){ for(int m=cnt[i.f]; m>=1; m--){ dp[cur][j+m][0]=min(min(dp[cur][j+m][0],dp[cur][j][1]+dp[i.f][m][0]+i.s),dp[cur][j][0]+dp[i.f][m][1]+2*i.s); dp[cur][j+m][1]=min(dp[cur][j+m][1],dp[cur][j][1]+dp[i.f][m][1] + 2*i.s); } } currSize+=cnt[i.f]; } } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin>>n>>k>>x; x--; for(int i=0; i<n-1; i++){ int a, b, c; cin>>a>>b>>c; a--;b--; edges[a].push_back({b,c}); edges[b].push_back({a,c}); } for(int i=0; i<=n; i++)for(int j=2; j<=k; j++)dp[i][j][0]=dp[i][j][1]=1000000000; subSize(x, -1); dfs(x, -1); cout<<dp[x][k][0]<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...