#include "roads.h"
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
vector<vector<pair<int, int>>> adj;
vector<long long> ans;
vector<long long> dp0, dp1;
int k;
void dfs(int s, int p, int w) {
for (auto u: adj[s]) {
if (u.first != p) dfs(u.first, s, u.second);
}
// printf("%d here\n", s);
vector<long long> srt;
for (auto u: adj[s]) {
if (u.first == p) continue;
srt.push_back(dp1[u.first] - dp0[u.first]);
dp0[s] += dp0[u.first];
dp1[s] += dp0[u.first];
}
// printf("%d here\n", s);
sort(srt.begin(), srt.end());
int sz = srt.size();
int lim = min(k, sz);
for (int i = 0; i < lim; i++) {
if (srt[i] < 0) {
dp0[s] += srt[i];
}
}
// printf("%d here\n", s);
dp0[s] += w;
lim = min(k-1, sz);
for (int i = 0; i < lim; i++) {
if (srt[i] < 0) {
dp1[s] += srt[i];
}
}
}
vector<long long> minimum_closure_costs(int n, vector<int> u, vector<int> v, vector<int> w) {
adj.resize(n);
ans.resize(n);
dp0.resize(n);
dp1.resize(n);
for (int i = 0; i < n-1; i++) {
adj[u[i]].push_back({v[i], w[i]});
adj[v[i]].push_back({u[i], w[i]});
}
// printf("here\n");
// for (int i = 0; i < n; i++) {
// printf("%d: ", i);
// for (auto u: adj[i]) printf("{%d, %d}\t", u.first, u.second);
// printf("\n");
// }
for (k = 0; k < n; k++) { // careful with k = 0 and generally with init
// printf("%d\n", k);
for (int i = 0; i < n; i++) {
dp0[i] = 0;
dp1[i] = 0;
}
dfs(0, 0, 0);
ans[k] = min(dp0[0], dp1[0]);
}
return ans;
}
# | 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... |