Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f963418

Browse files
feat: add solutions to lc problem: No.3367 (doocs#3815)
No.3367.Maximize Sum of Weights after Edge Removals
1 parent 61ec285 commit f963418

File tree

7 files changed

+530
-6
lines changed

7 files changed

+530
-6
lines changed

‎solution/3300-3399/3367.Maximize Sum of Weights after Edge Removals/README.md‎

Lines changed: 178 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,25 +88,200 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3300-3399/3367.Ma
8888
#### Python3
8989

9090
```python
91-
91+
class Solution:
92+
def maximizeSumOfWeights(self, edges: List[List[int]], k: int) -> int:
93+
def dfs(u: int, fa: int) -> Tuple[int, int]:
94+
s = 0
95+
t = []
96+
for v, w in g[u]:
97+
if v == fa:
98+
continue
99+
a, b = dfs(v, u)
100+
s += a
101+
if (d := (w + b - a)) > 0:
102+
t.append(d)
103+
t.sort(reverse=True)
104+
return s + sum(t[:k]), s + sum(t[: k - 1])
105+
106+
n = len(edges) + 1
107+
g: List[List[Tuple[int, int]]] = [[] for _ in range(n)]
108+
for u, v, w in edges:
109+
g[u].append((v, w))
110+
g[v].append((u, w))
111+
x, y = dfs(0, -1)
112+
return max(x, y)
92113
```
93114

94115
#### Java
95116

96117
```java
97-
118+
class Solution {
119+
private List<int[]>[] g;
120+
private int k;
121+
122+
public long maximizeSumOfWeights(int[][] edges, int k) {
123+
this.k = k;
124+
int n = edges.length + 1;
125+
g = new List[n];
126+
Arrays.setAll(g, i -> new ArrayList<>());
127+
for (var e : edges) {
128+
int u = e[0], v = e[1], w = e[2];
129+
g[u].add(new int[] {v, w});
130+
g[v].add(new int[] {u, w});
131+
}
132+
var ans = dfs(0, -1);
133+
return Math.max(ans[0], ans[1]);
134+
}
135+
136+
private long[] dfs(int u, int fa) {
137+
long s = 0;
138+
List<Long> t = new ArrayList<>();
139+
for (var e : g[u]) {
140+
int v = e[0], w = e[1];
141+
if (v == fa) {
142+
continue;
143+
}
144+
var res = dfs(v, u);
145+
s += res[0];
146+
long d = w + res[1] - res[0];
147+
if (d > 0) {
148+
t.add(d);
149+
}
150+
}
151+
t.sort(Comparator.reverseOrder());
152+
for (int i = 0; i < Math.min(t.size(), k - 1); ++i) {
153+
s += t.get(i);
154+
}
155+
return new long[] {s + (t.size() >= k ? t.get(k - 1) : 0), s};
156+
}
157+
}
98158
```
99159

100160
#### C++
101161

102162
```cpp
103-
163+
class Solution {
164+
public:
165+
long long maximizeSumOfWeights(vector<vector<int>>& edges, int k) {
166+
int n = edges.size() + 1;
167+
vector<vector<pair<int, int>>> g(n);
168+
for (auto& e : edges) {
169+
int u = e[0], v = e[1], w = e[2];
170+
g[u].emplace_back(v, w);
171+
g[v].emplace_back(u, w);
172+
}
173+
using ll = long long;
174+
auto dfs = [&](auto&& dfs, int u, int fa) -> pair<ll, ll> {
175+
ll s = 0;
176+
vector<ll> t;
177+
for (auto& [v, w] : g[u]) {
178+
if (v == fa) {
179+
continue;
180+
}
181+
auto [a, b] = dfs(dfs, v, u);
182+
s += a;
183+
ll d = w + b - a;
184+
if (d > 0) {
185+
t.push_back(d);
186+
}
187+
}
188+
ranges::sort(t, greater<>());
189+
for (int i = 0; i < min((int)t.size(), k - 1); ++i) {
190+
s += t[i];
191+
}
192+
return {s + (t.size() >= k ? t[k - 1] : 0), s};
193+
};
194+
195+
auto [x, y] = dfs(dfs, 0, -1);
196+
return max(x, y);
197+
}
198+
};
104199
```
105200

106201
#### Go
107202

108203
```go
204+
func maximizeSumOfWeights(edges [][]int, k int) int64 {
205+
n := len(edges) + 1
206+
g := make([][][]int, n)
207+
for _, e := range edges {
208+
u, v, w := e[0], e[1], e[2]
209+
g[u] = append(g[u], []int{v, w})
210+
g[v] = append(g[v], []int{u, w})
211+
}
212+
213+
var dfs func(u, fa int) (int64, int64)
214+
dfs = func(u, fa int) (int64, int64) {
215+
var s int64
216+
var t []int64
217+
for _, e := range g[u] {
218+
v, w := e[0], e[1]
219+
if v == fa {
220+
continue
221+
}
222+
a, b := dfs(v, u)
223+
s += a
224+
d := int64(w) + b - a
225+
if d > 0 {
226+
t = append(t, d)
227+
}
228+
}
229+
sort.Slice(t, func(i, j int) bool {
230+
return t[i] > t[j]
231+
})
232+
for i := 0; i < min(len(t), k-1); i++ {
233+
s += t[i]
234+
}
235+
s2 := s
236+
if len(t) >= k {
237+
s += t[k-1]
238+
}
239+
return s, s2
240+
}
241+
242+
x, y := dfs(0, -1)
243+
return max(x, y)
244+
}
245+
```
109246

247+
#### TypeScript
248+
249+
```ts
250+
function maximizeSumOfWeights(edges: number[][], k: number): number {
251+
const n = edges.length + 1;
252+
const g: [number, number][][] = Array.from({ length: n }, () => []);
253+
for (const [u, v, w] of edges) {
254+
g[u].push([v, w]);
255+
g[v].push([u, w]);
256+
}
257+
const dfs = (u: number, fa: number): [number, number] => {
258+
let s = 0;
259+
const t: number[] = [];
260+
261+
for (const [v, w] of g[u]) {
262+
if (v === fa) continue;
263+
264+
const [a, b] = dfs(v, u);
265+
s += a;
266+
const d = w + b - a;
267+
if (d > 0) t.push(d);
268+
}
269+
270+
t.sort((a, b) => b - a);
271+
for (let i = 0; i < Math.min(t.length, k - 1); i++) {
272+
s += t[i];
273+
}
274+
const s2 = s;
275+
if (t.length >= k) {
276+
s += t[k - 1];
277+
}
278+
279+
return [s, s2];
280+
};
281+
282+
const [x, y] = dfs(0, -1);
283+
return Math.max(x, y);
284+
}
110285
```
111286

112287
<!-- tabs:end -->

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /