#include <cassert>
#include <cstdio>
#include <vector>
#include<bits/stdc++.h>
using namespace std;
long long dp[100005][2]; //dp[v][0] = 0/1 -> connected with parent or not
vector<pair<int,int>> adj[100005];
void dfs(int v,int p,int k)
{
dp[v][0] = dp[v][1] = 0;
vector<long long> diffs;
for(auto e : adj[v])
{
int u = e.first;
long long w = e.second;
if(u != p)
{
dfs(u,v,k);
dp[v][0] += dp[u][1] + w;
dp[v][1] += dp[u][1] + w;
diffs.push_back({dp[u][0] - w - dp[u][1]});
}
}
sort(diffs.begin(),diffs.end());
int L = diffs.size();
for(int j = 0 ; j < min(L,k) ; j++)
{
if(diffs[j] < 0)
{
dp[v][0] += diffs[j];
if(j != k-1)
dp[v][1] += diffs[j];
}
}
}
std::vector<long long> minimum_closure_costs(int N, std::vector<int> U, std::vector<int> V, std::vector<int> W) {
for(int i = 0 ; i < N ; i++)
{
U[i]++;
V[i]++;
adj[U[i]].push_back({V[i],W[i]});
adj[V[i]].push_back({U[i],W[i]});
}
vector<long long> ret;
for(int k = 0 ; k <= N - 1 ; k++)
{
dfs(1,1,k);
ret.push_back(dp[1][0]);
}
return ret;
}
# | 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... |