#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... |