@@ -74,3 +74,126 @@ class Solution2 {
74
74
return result;
75
75
}
76
76
};
77
+
78
+ // Time: O(n)
79
+ // Space: O(n)
80
+ // iterative dfs, tree dp
81
+ class Solution3 {
82
+ public:
83
+ long long maxOutput (int n, vector<vector<int >>& edges, vector<int >& price) {
84
+ vector<vector<int >> adj (n);
85
+ for (const auto & e : edges) {
86
+ adj[e[0 ]].emplace_back (e[1 ]);
87
+ adj[e[1 ]].emplace_back (e[0 ]);
88
+ }
89
+
90
+ const auto & iter_dfs = [&]() {
91
+ vector<int64_t > dp (n);
92
+ vector<tuple<int , int , int >> stk = {{1 , 0 , -1 }};
93
+ while (!empty (stk)) {
94
+ const auto [step, u, p] = stk.back (); stk.pop_back ();
95
+ if (step == 1 ) {
96
+ stk.emplace_back (2 , u, p);
97
+ for (const auto & v : adj[u]) {
98
+ if (v == p) {
99
+ continue ;
100
+ }
101
+ stk.emplace_back (1 , v, u);
102
+ }
103
+ } else if (step == 2 ) {
104
+ dp[u] = price[u];
105
+ for (const auto & v : adj[u]) {
106
+ if (v == p) {
107
+ continue ;
108
+ }
109
+ dp[u] = max (dp[u], dp[v] + price[u]);
110
+ }
111
+ }
112
+ }
113
+ return dp;
114
+ };
115
+
116
+ const auto & dp = iter_dfs ();
117
+ const auto & iter_dfs2 = [&]() {
118
+ int64_t result = 0 ;
119
+ vector<tuple<int , int , int64_t >> stk = {{0 , -1 , 0 }};
120
+ while (!empty (stk)) {
121
+ const auto [u, p, curr] = stk.back (); stk.pop_back ();
122
+ result = max ({result, curr, dp[u] - price[u]});
123
+ vector<vector<int64_t >> top2 = {{curr, p}, {0 , -1 }};
124
+ for (const auto & v : adj[u]) {
125
+ if (v == p) {
126
+ continue ;
127
+ }
128
+ vector<int64_t > curr = {dp[v], v};
129
+ for (int i = 0 ; i < size (top2); ++i) {
130
+ if (curr > top2[i]) {
131
+ swap (top2[i], curr);
132
+ }
133
+ }
134
+ }
135
+ for (const auto & v : adj[u]) {
136
+ if (v == p) {
137
+ continue ;
138
+ }
139
+ stk.emplace_back (v, u, ((top2[0 ][1 ] != v) ? top2[0 ][0 ] : top2[1 ][0 ]) + price[u]);
140
+ }
141
+ }
142
+ return result;
143
+ };
144
+
145
+ return iter_dfs2 ();
146
+ }
147
+ };
148
+
149
+ // Time: O(n)
150
+ // Space: O(n)
151
+ // dfs, tree dp
152
+ class Solution4_RE { // stack overflow due to deep recursion
153
+ public:
154
+ long long maxOutput (int n, vector<vector<int >>& edges, vector<int >& price) {
155
+ vector<vector<int >> adj (n);
156
+ for (const auto & e : edges) {
157
+ adj[e[0 ]].emplace_back (e[1 ]);
158
+ adj[e[1 ]].emplace_back (e[0 ]);
159
+ }
160
+ vector<int64_t > dp (n);
161
+ const function<int64_t (int , int )> dfs = [&](int u, int p) {
162
+ dp[u] = price[u];
163
+ for (const auto & v : adj[u]) {
164
+ if (v == p) {
165
+ continue ;
166
+ }
167
+ dp[u] = max (dp[u], dfs (v, u) + price[u]);
168
+ }
169
+ return dp[u];
170
+ };
171
+
172
+ int64_t result = 0 ;
173
+ const function<void (int , int , int64_t )> dfs2 = [&](int u, int p, int64_t curr) {
174
+ result = max ({result, curr, dp[u] - price[u]});
175
+ vector<vector<int64_t >> top2 = {{curr, p}, {0 , -1 }};
176
+ for (const auto & v : adj[u]) {
177
+ if (v == p) {
178
+ continue ;
179
+ }
180
+ vector<int64_t > curr = {dp[v], v};
181
+ for (int i = 0 ; i < size (top2); ++i) {
182
+ if (curr > top2[i]) {
183
+ swap (top2[i], curr);
184
+ }
185
+ }
186
+ }
187
+ for (const auto & v : adj[u]) {
188
+ if (v == p) {
189
+ continue ;
190
+ }
191
+ dfs2 (v, u, ((top2[0 ][1 ] != v) ? top2[0 ][0 ] : top2[1 ][0 ]) + price[u]);
192
+ }
193
+ };
194
+
195
+ dfs (0 , -1 );
196
+ dfs2 (0 , -1 , 0 );
197
+ return result;
198
+ }
199
+ };
0 commit comments