@@ -63,22 +63,139 @@ Note that we cannot choose more than one edge because all edges are adjacent to
63
63
64
64
<!-- 这里可写通用的实现逻辑 -->
65
65
66
+ ** 方法一:树形 DP**
67
+
66
68
<!-- tabs:start -->
67
69
68
70
### ** Python3**
69
71
70
72
<!-- 这里可写当前语言的特殊实现逻辑 -->
71
73
72
74
``` python
73
-
75
+ class Solution :
76
+ def maxScore (self , edges : List[List[int ]]) -> int :
77
+ def dfs (i ):
78
+ a = b = 0
79
+ t = 0
80
+ for j in g[i]:
81
+ x, y = dfs(j)
82
+ a += y
83
+ b += y
84
+ t = max (t, x - y + g[i][j])
85
+ b += t
86
+ return a, b
87
+
88
+ g = defaultdict(lambda : defaultdict(lambda : - inf))
89
+ for i, (p, w) in enumerate (edges[1 :], 1 ):
90
+ g[p][i] = w
91
+ return max (dfs(0 ))
74
92
```
75
93
76
94
### ** Java**
77
95
78
96
<!-- 这里可写当前语言的特殊实现逻辑 -->
79
97
80
98
``` java
99
+ class Solution {
100
+ private Map<Integer , Integer > [] g;
101
+
102
+ public long maxScore (int [][] edges ) {
103
+ int n = edges. length;
104
+ g = new Map [n + 1 ];
105
+ for (int i = 0 ; i < n + 1 ; ++ i) {
106
+ g[i] = new HashMap<> ();
107
+ }
108
+ for (int i = 1 ; i < n; ++ i) {
109
+ int p = edges[i][0 ], w = edges[i][1 ];
110
+ g[p]. put(i, w);
111
+ }
112
+ return dfs(0 )[1 ];
113
+ }
114
+
115
+ private long [] dfs (int i ) {
116
+ long a = 0 , b = 0 ;
117
+ long t = 0 ;
118
+ for (int j : g[i]. keySet()) {
119
+ long [] s = dfs(j);
120
+ a += s[1 ];
121
+ b += s[1 ];
122
+ t = Math . max(t, s[0 ] - s[1 ] + g[i]. get(j));
123
+ }
124
+ b += t;
125
+ return new long []{a, b};
126
+ }
127
+ }
128
+ ```
129
+
130
+ ### ** C++**
131
+
132
+ ``` cpp
133
+ using ll = long long ;
134
+
135
+ class Solution {
136
+ public:
137
+ vector<unordered_map<int, int>> g;
138
+
139
+ long long maxScore(vector<vector<int>>& edges) {
140
+ int n = edges.size();
141
+ g.resize(n + 1);
142
+ for (int i = 1; i < n; ++i) {
143
+ int p = edges[i][0], w = edges[i][1];
144
+ g[p][i] = w;
145
+ }
146
+ return dfs(0 ).second;
147
+ }
148
+
149
+ pair<ll, ll> dfs (int i) {
150
+ ll a = 0, b = 0;
151
+ ll s = 0;
152
+ for (auto& [ j, v] : g[ i] ) {
153
+ auto t = dfs(j);
154
+ a += t.second;
155
+ b += t.second;
156
+ s = max(s, t.first - t.second + v);
157
+ }
158
+ b += s;
159
+ return {a, b};
160
+ }
161
+ };
162
+ ```
81
163
164
+ ### **Go**
165
+
166
+ ```go
167
+ func maxScore(edges [][]int) int64 {
168
+ n := len(edges)
169
+ g := make([]map[int]int, n+1)
170
+ for i := range g {
171
+ g[i] = make(map[int]int)
172
+ }
173
+ for i := 1; i < n; i++ {
174
+ p, w := edges[i][0], edges[i][1]
175
+ g[p][i] = w
176
+ }
177
+ var dfs func(i int) []int
178
+ dfs = func(i int) []int {
179
+ a, b := 0, 0
180
+ s := 0
181
+ for j, v := range g[i] {
182
+ t := dfs(j)
183
+ a += t[1]
184
+ b += t[1]
185
+ s = max(s, t[0]-t[1]+v)
186
+ }
187
+ b += s
188
+ return []int{a, b}
189
+ }
190
+ return int64(dfs(0)[1])
191
+ }
192
+
193
+ func max(a, b int) int {
194
+ if a > b {
195
+ return a
196
+ }
197
+ return b
198
+ }
82
199
```
83
200
84
201
### ** TypeScript**
0 commit comments