Skip to content

Commit 5c78d0b

Browse files
authored
Update difference-between-maximum-and-minimum-price-sum.cpp
1 parent 550d1e3 commit 5c78d0b

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed

C++/difference-between-maximum-and-minimum-price-sum.cpp

+123
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,126 @@ class Solution2 {
7474
return result;
7575
}
7676
};
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

Comments
 (0)