#include "roads.h"
#include<bits/stdc++.h>
using namespace std;
vector<long long> minimum_closure_costs(int n, vector<int> u, vector<int> v, vector<int> w){
#define all(v) v.begin(), v.end()
#define int long long
#define pii pair<int, int>
#define X first
#define Y second
#define SZ(s) ((int)s.size())
vector< vector< pii > > g(n);
vector< int > ans(n);
for(int i = 0; i < n - 1; ++i){
g[u[i]].push_back({v[i], w[i]});
g[v[i]].push_back({u[i], w[i]});
}
vector< int > ord(n);
iota(all(ord), 0);
sort(all(ord), [&](int a, int b){
return SZ(g[a]) > SZ(g[b]);
});
vector< int > take(n), vis(n);
for(int k = 0; k < n; ++k){
for(auto &id : ord){
if(SZ(g[id]) <= k) break;
take[id] = SZ(g[id]) - k;
vis[id] = 0;
}
auto dfs = [&](auto dfs, int cur, int par, int d = 0) -> void {
vis[cur] = 1;
for(auto &[nxt, w] : g[cur]) if(!vis[nxt] && SZ(g[nxt]) > k) {
dfs(dfs, nxt, cur, w);
if(take[nxt] && take[cur]){
--take[nxt];
--take[cur];
++ans[k];
}
}
};
for(auto &id : ord){
if(SZ(g[id]) <= k) break;
if(!vis[id]) dfs(dfs, id, id);
ans[k] += take[id];
}
}
return ans;
}
/*
5
0 1 1
0 2 1
0 3 1
0 4 1
*/
# | 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... |