Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long int LL;
- #define st first
- #define nd second
- #define PII pair <int, int>
- const int N = 80;
- const LL INF = 1e18 + 9LL;
- int n, m, k;
- int pod[N];
- LL dp[N][N][N];
- vector <PII> G[N];
- void update(int a, int b, LL cost){
- for(int i = 0; i <= pod[a] + pod[b]; ++i)
- for(int j = 0; j <= pod[a] + pod[b]; ++j)
- dp[0][i][j] = INF;
- for(int i = 0; i <= pod[a]; ++i)
- for(int j = 0; j <= pod[b]; ++j)
- for(int ii = 0; ii <= pod[a]; ++ii)
- for(int jj = 0; jj <= pod[b]; ++jj)
- dp[0][i + j][ii + jj] = min(dp[0][i + j][ii + jj], dp[a][i][ii] + dp[b][j][jj]);
- for(int i = 0; i <= pod[a] + pod[b]; ++i)
- for(int j = 0; j <= pod[a] + pod[b]; ++j)
- dp[a][i][j] = min(dp[a][i][j], dp[0][i][j]);
- dp[a][0][1] = cost;
- pod[a] += pod[b];
- }
- void dfs(int u, int p, LL cost){
- for(int i = 0; i <= k; ++i)
- for(int j = 0; j <= m; ++j)
- dp[u][i][j] = INF;
- dp[u][0][1] = cost;
- dp[u][1][0] = 0;
- pod[u] = 1;
- for(auto v: G[u]){
- if(v.first == p)
- continue;
- dfs(v.first, u, v.second);
- update(u, v.first, cost);
- }
- // for(int i = 0; i <= pod[u]; ++i)
- // for(int j = 0; j <= pod[u]; ++j)
- // printf("%d :: %d %d :: %lld\n", u, i, j, dp[u][i][j]);
- }
- int main(){
- scanf("%d %d %d", &n, &m, &k);
- for(int i = 1; i < n; ++i){
- int u, v, c;
- scanf("%d %d %d", &u, &v, &c);
- G[u].push_back({v, c});
- G[v].push_back({u, c});
- }
- dfs(1, 0, INF);
- if(dp[1][k][m] == INF)
- puts("-1");
- else
- printf("%lld\n", dp[1][k][m]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement