Skip to content

Commit 039cdb8

Browse files
authored
Create maximize-sum-of-weights-after-edge-removals.cpp
1 parent 628ce16 commit 039cdb8

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// Time: O(n)
2+
// Space: O(n)
3+
4+
// iterative dfs, quick select
5+
class Solution {
6+
public:
7+
long long maximizeSumOfWeights(vector<vector<int>>& edges, int k) {
8+
vector<vector<pair<int, int>>> adj(size(edges) + 1);
9+
for (const auto& e : edges) {
10+
adj[e[0]].emplace_back(e[1], e[2]);
11+
adj[e[1]].emplace_back(e[0], e[2]);
12+
}
13+
const auto& iter_dfs = [&]() {
14+
vector<pair<int64_t, int64_t>> cnt(size(adj));
15+
vector<tuple<int, int, int>> stk = {{1, 0, -1}};
16+
while (!empty(stk)) {
17+
const auto [step, u, p] = stk.back(); stk.pop_back();
18+
if (step == 1) {
19+
stk.emplace_back(2, u, p);
20+
for (const auto& [v, w] : adj[u]) {
21+
if (v == p) {
22+
continue;
23+
}
24+
stk.emplace_back(1, v, u);
25+
}
26+
} else if (step == 2) {
27+
int64_t curr = 0;
28+
vector<int64_t> diff;
29+
for (const auto& [v, w] : adj[u]) {
30+
if (v == p) {
31+
continue;
32+
}
33+
curr += cnt[v].first;
34+
diff.emplace_back(max((cnt[v].second + w) - cnt[v].first, static_cast<int64_t>(0)));
35+
}
36+
if (k - 1 < size(diff)) {
37+
nth_element(begin(diff), begin(diff) + (k - 1), end(diff), greater<int>());
38+
}
39+
cnt[u] = pair(accumulate(cbegin(diff), cbegin(diff) + min(k, static_cast<int>(size(diff))), curr),
40+
accumulate(cbegin(diff), cbegin(diff) + min(k - 1, static_cast<int>(size(diff))), curr));
41+
}
42+
}
43+
return cnt[0].first;
44+
};
45+
46+
return iter_dfs();
47+
}
48+
};
49+
50+
// Time: O(n)
51+
// Space: O(n)
52+
// dfs, quick select
53+
class Solution2 {
54+
public:
55+
long long maximizeSumOfWeights(vector<vector<int>>& edges, int k) {
56+
vector<vector<pair<int, int>>> adj(size(edges) + 1);
57+
for (const auto& e : edges) {
58+
adj[e[0]].emplace_back(e[1], e[2]);
59+
adj[e[1]].emplace_back(e[0], e[2]);
60+
}
61+
const function<pair<int64_t, int64_t>(int, int)> dfs = [&](int u, int p) {
62+
int64_t result = 0;
63+
vector<int64_t> diff;
64+
for (const auto& [v, w] : adj[u]) {
65+
if (v == p) {
66+
continue;
67+
}
68+
const auto& cnt = dfs(v, u);
69+
result += cnt.first;
70+
diff.emplace_back(max((cnt.second + w) - cnt.first, static_cast<int64_t>(0)));
71+
}
72+
if (k - 1 < size(diff)) {
73+
nth_element(begin(diff), begin(diff) + (k - 1), end(diff), greater<int>());
74+
}
75+
76+
return pair(accumulate(cbegin(diff), cbegin(diff) + min(k, static_cast<int>(size(diff))), result),
77+
accumulate(cbegin(diff), cbegin(diff) + min(k - 1, static_cast<int>(size(diff))), result));
78+
};
79+
80+
return dfs(0, -1).first;
81+
}
82+
};

0 commit comments

Comments
 (0)