# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1223440 | radaiosm7 | Road Closures (APIO21_roads) | C++20 | 0 ms | 0 KiB |
#include <cassert>
#include <cstdio>
#include <vector>
#include <cassert>
#include <cstdio>
#include <vector>
#include<bits/stdc++.h>
using namespace std;
int kalispera = -1;
long long dp[100005][2]; //dp[v][0] = 0/1 -> connected with parent or not
vector<pair<long long,long long>> adj[100005];
void dfs(long long v,long long p,long long k)
{
dp[v][0] = dp[v][1] = 0;
vector<long long> diffs;
for(auto e : adj[v])
{
long long u = e.first;
long long w = e.second;
if(u != p)
{
dfs(u,v,k);
dp[v][0] += dp[u][0] + w;
dp[v][1] += dp[u][0] + w;
diffs.push_back({dp[u][1] - w - dp[u][0]});
}
}
sort(diffs.begin(),diffs.end());
long long L = diffs.size();
for(long long 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) {
++kalispera;
if (kalispera > 0) return -69420;
for(long long 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;
int max_check = N-1;
for(int i = 1 ; i <= N ; i++)
{
int L = adj[i].size();
max_check = max(max_check,L);
}
for(long long k = 0 ; k <= max_check ; k++)
{
dfs(1,1,k);
ret.push_back(dp[1][0]);
}
// for(int k = max_check+1 ; k < N ; k++)
// ret.push_back(0);
return ret;
}