Advertisement
Guest User

Untitled

a guest
Sep 21st, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.81 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long int LL;
  6.  
  7. #define st first
  8. #define nd second
  9. #define PII pair <int, int>
  10.  
  11. const int N = 80;
  12. const LL INF = 1e18 + 9LL;
  13.  
  14. int n, m, k;
  15. int pod[N];
  16. LL dp[N][N][N];
  17. vector <PII> G[N];
  18.  
  19. void update(int a, int b, LL cost){
  20.     for(int i = 0; i <= pod[a] + pod[b]; ++i)
  21.         for(int j = 0; j <= pod[a] + pod[b]; ++j)
  22.             dp[0][i][j] = INF;
  23.  
  24.     for(int i = 0; i <= pod[a]; ++i)
  25.         for(int j = 0; j <= pod[b]; ++j)
  26.             for(int ii = 0; ii <= pod[a]; ++ii)
  27.                 for(int jj = 0; jj <= pod[b]; ++jj)
  28.                     dp[0][i + j][ii + jj] = min(dp[0][i + j][ii + jj], dp[a][i][ii] + dp[b][j][jj]);
  29.    
  30.     for(int i = 0; i <= pod[a] + pod[b]; ++i)
  31.         for(int j = 0; j <= pod[a] + pod[b]; ++j)
  32.             dp[a][i][j] = min(dp[a][i][j], dp[0][i][j]);
  33.    
  34.     dp[a][0][1] = cost;
  35.     pod[a] += pod[b];
  36. }
  37.  
  38. void dfs(int u, int p, LL cost){
  39.     for(int i = 0; i <= k; ++i)
  40.         for(int j = 0; j <= m; ++j)
  41.             dp[u][i][j] = INF;
  42.  
  43.     dp[u][0][1] = cost;
  44.     dp[u][1][0] = 0;
  45.            
  46.     pod[u] = 1;
  47.     for(auto v: G[u]){
  48.         if(v.first == p)
  49.             continue;
  50.        
  51.         dfs(v.first, u, v.second);
  52.         update(u, v.first, cost);
  53.     }
  54.    
  55. //     for(int i = 0; i <= pod[u]; ++i)
  56. //         for(int j = 0; j <= pod[u]; ++j)
  57. //             printf("%d :: %d %d :: %lld\n", u, i, j, dp[u][i][j]);
  58. }
  59.  
  60. int main(){
  61.     scanf("%d %d %d", &n, &m, &k);
  62.     for(int i = 1; i < n; ++i){
  63.         int u, v, c;
  64.         scanf("%d %d %d", &u, &v, &c);
  65.        
  66.         G[u].push_back({v, c});
  67.         G[v].push_back({u, c});
  68.     }
  69.    
  70.     dfs(1, 0, INF);
  71.     if(dp[1][k][m] == INF)
  72.         puts("-1");
  73.     else
  74.         printf("%lld\n", dp[1][k][m]);
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement