Skip to content

Commit 25a3f22

Browse files
authored
feat: add solutions to lc problem: No.3558 (#5252)
1 parent f60e9d3 commit 25a3f22

7 files changed

Lines changed: 532 additions & 8 deletions

File tree

solution/3500-3599/3558.Number of Ways to Assign Edge Weights I/README.md

Lines changed: 181 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,32 +88,209 @@ tags:
8888

8989
<!-- solution:start -->
9090

91-
### 方法一
91+
### 方法一:DFS + 数学
92+
93+
我们先通过边构建出 $g$,其中 $g[u]$ 表示 $u$ 的所有邻接点。
94+
95+
接下来,我们使用一个函数 $\textit{dfs}$ 来求出树的深度 $d$,那么从 $d$ 中选出奇数个数的方案,就是答案。根据定理,从 $d$ 中选出奇数个数的方案数为 $2^{d-1}$,我们可以用快速幂求出答案。
96+
97+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是树的节点数。
9298

9399
<!-- tabs:start -->
94100

95101
#### Python3
96102

97103
```python
98-
104+
class Solution:
105+
def assignEdgeWeights(self, edges: List[List[int]]) -> int:
106+
def dfs(i: int, fa: int = 0) -> int:
107+
res = 0
108+
for j in g[i]:
109+
if j != fa:
110+
res = max(res, dfs(j, i) + 1)
111+
return res
112+
113+
n = len(edges) + 1
114+
g = [[] for _ in range(n + 1)]
115+
for u, v in edges:
116+
g[u].append(v)
117+
g[v].append(u)
118+
d = dfs(1)
119+
return pow(2, d - 1, 10**9 + 7)
99120
```
100121

101122
#### Java
102123

103124
```java
104-
125+
class Solution {
126+
private List<Integer>[] g;
127+
128+
public int assignEdgeWeights(int[][] edges) {
129+
int n = edges.length + 1;
130+
g = new List[n + 1];
131+
Arrays.setAll(g, k -> new ArrayList<>());
132+
133+
for (var e : edges) {
134+
int u = e[0];
135+
int v = e[1];
136+
g[u].add(v);
137+
g[v].add(u);
138+
}
139+
140+
return (int) pow(2, dfs(1, 0) - 1, 1_000_000_007);
141+
}
142+
143+
private int dfs(int i, int fa) {
144+
int res = 0;
145+
for (int j : g[i]) {
146+
if (j != fa) {
147+
res = Math.max(res, dfs(j, i) + 1);
148+
}
149+
}
150+
return res;
151+
}
152+
153+
private long pow(long a, int n, int mod) {
154+
long res = 1;
155+
while (n > 0) {
156+
if ((n & 1) != 0) {
157+
res = res * a % mod;
158+
}
159+
a = a * a % mod;
160+
n >>= 1;
161+
}
162+
return res;
163+
}
164+
}
105165
```
106166

107167
#### C++
108168

109169
```cpp
110-
170+
class Solution {
171+
public:
172+
int assignEdgeWeights(vector<vector<int>>& edges) {
173+
int n = edges.size() + 1;
174+
vector<vector<int>> g(n + 1);
175+
176+
for (auto& e : edges) {
177+
int u = e[0];
178+
int v = e[1];
179+
g[u].push_back(v);
180+
g[v].push_back(u);
181+
}
182+
183+
auto dfs = [&](this auto&& dfs, int i, int fa) -> int {
184+
int res = 0;
185+
for (int j : g[i]) {
186+
if (j != fa) {
187+
res = max(res, dfs(j, i) + 1);
188+
}
189+
}
190+
return res;
191+
};
192+
193+
return pow(2, dfs(1, 0) - 1, 1000000007);
194+
}
195+
196+
private:
197+
long long pow(long long a, int n, int mod) {
198+
long long res = 1;
199+
while (n > 0) {
200+
if (n & 1) {
201+
res = res * a % mod;
202+
}
203+
a = a * a % mod;
204+
n >>= 1;
205+
}
206+
return res;
207+
}
208+
};
111209
```
112210

113211
#### Go
114212

115213
```go
214+
func assignEdgeWeights(edges [][]int) int {
215+
const mod = 1_000_000_007
216+
217+
n := len(edges) + 1
218+
g := make([][]int, n+1)
219+
220+
for _, e := range edges {
221+
u, v := e[0], e[1]
222+
g[u] = append(g[u], v)
223+
g[v] = append(g[v], u)
224+
}
225+
226+
var dfs func(int, int) int
227+
dfs = func(i, fa int) int {
228+
res := 0
229+
for _, j := range g[i] {
230+
if j != fa {
231+
res = max(res, dfs(j, i)+1)
232+
}
233+
}
234+
return res
235+
}
236+
237+
return pow(2, dfs(1, 0)-1, mod)
238+
}
239+
240+
func pow(a, n, mod int) int {
241+
res := 1
242+
for n > 0 {
243+
if n&1 > 0 {
244+
res = res * a % mod
245+
}
246+
a = a * a % mod
247+
n >>= 1
248+
}
249+
return res
250+
}
251+
```
116252

253+
#### TypeScript
254+
255+
```ts
256+
function assignEdgeWeights(edges: number[][]): number {
257+
const mod = 1_000_000_007;
258+
const n = edges.length + 1;
259+
const g: number[][] = Array.from({ length: n + 1 }, () => []);
260+
261+
for (const [u, v] of edges) {
262+
g[u].push(v);
263+
g[v].push(u);
264+
}
265+
266+
const dfs = (i: number, fa: number): number => {
267+
let res = 0;
268+
for (const j of g[i]) {
269+
if (j !== fa) {
270+
res = Math.max(res, dfs(j, i) + 1);
271+
}
272+
}
273+
return res;
274+
};
275+
276+
const pow = (a: number, n: number, mod: number): number => {
277+
let res = 1n;
278+
let x = BigInt(a);
279+
const m = BigInt(mod);
280+
281+
while (n > 0) {
282+
if (n & 1) {
283+
res = (res * x) % m;
284+
}
285+
x = (x * x) % m;
286+
n >>= 1;
287+
}
288+
289+
return Number(res);
290+
};
291+
292+
return pow(2, dfs(1, 0) - 1, mod);
293+
}
117294
```
118295

119296
<!-- tabs:end -->

0 commit comments

Comments
 (0)