#include "roads.h"
#include <bits/stdc++.h>
using namespace std ;
#define int long long
vector <pair<int,int>> adj[2003] ;
int dp[2003][2] ;
int nw ;
void dfs(int x,int par){
  int nd=0 ;
  vector <int> v ;
  for (auto [a,l] : adj[x]){
    if (a==par) continue ;
    dfs(a,x) ;
    nd+=min(dp[a][0],dp[a][1]+l) ;
    v.push_back(-min(dp[a][0],dp[a][1]+l)+(dp[a][1]+l)) ;
  }
  sort(v.begin(),v.end()) ;
  if ((int)v.size()>=(int)adj[x].size()-nw){
    dp[x][0]=nd ;
    for (int i = 0 ; i < (int)adj[x].size()-nw ; i ++){
      dp[x][0]+=v[i] ;
    }
  }
  if ((int)v.size()>=(int)adj[x].size()-nw-1){
    dp[x][1]=nd ;
    for (int i = 0 ; i < (int)adj[x].size()-nw-1 ; i ++){
      dp[x][1]+=v[i] ;
    }
  }
  dp[x][1]=min(dp[x][1],dp[x][0]) ;
  // cout << x << " " << dp[x][0] << " " << dp[x][1] << endl ;
}
std::vector<long long> minimum_closure_costs(signed N, std::vector<signed> U,
                                             std::vector<signed> V,
                                             std::vector<signed> W) {
  int i,j ;
  for (i = 0 ; i < N-1 ; i ++){
    adj[U[i]].push_back({V[i],W[i]}) ;
    adj[V[i]].push_back({U[i],W[i]}) ;
  }
  vector <int> ans(N) ;
  for (i = 0 ; i < N ; i ++){
    nw=i ;
    for (j = 0 ; j < N ; j ++) dp[j][0]=dp[j][1]=LLONG_MAX/10000 ;
    dfs(0,-1) ;
    ans[i]=dp[0][0] ;
  }
  return ans;
}
// dp[i][0]=ok
// dp[i][1]=need one more
// dp[i][1]<=dp[i][0]
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |