@@ -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