Use this to learn the idea, then write your own version.
123 45class Solution {6public:7 long long finishTime(int n, vector<vector<int>>& edges, vector<int>& baseTime) {8 static const auto& NEG_INF = numeric_limits<int64_t>::min();9 static const auto& POS_INF = numeric_limits<int64_t>::max();10 11 vector<vector<int>> adj(n);12 vector<int64_t> dp(n);13 const auto iter_dfs = [&]() {14 vector<tuple<int, int, int>> stk = {{1, 0, -1}};15 while (!empty(stk)) {16 const auto [step, u, p] = stk.back(); stk.pop_back();17 if (step == 1) {18 stk.emplace_back(2, u, p);19 for (const auto& v : adj[u]) {20 if (v == p) {21 continue;22 }23 stk.emplace_back(1, v, u);24 }25 } else if (step == 2) {26 auto mx = NEG_INF, mn = POS_INF;27 for (const auto& v : adj[u]) {28 if (v == p) {29 continue;30 }31 mx = max(mx, dp[v]);32 mn = min(mn, dp[v]);33 }34 dp[u] = (mx != NEG_INF ? (2 * mx - mn) : 0) + baseTime[u];35 }36 }37 };38 39 const auto iter_dfs2 = [&]() -> int64_t {40 const auto top2 = [](int64_t a, int64_t b, int64_t x, auto cmp) -> pair<int64_t, int64_t> {41 if (cmp(x, a)) {42 b = a;43 a = x;44 } else if (cmp(x, b)) {45 b = x;46 }47 return {a, b};48 };49 50 auto result = POS_INF;51 vector<tuple<int, int, int64_t>> stk = {{0, -1, NEG_INF}};52 while (!empty(stk)) {53 const auto [u, p, t] = stk.back(); stk.pop_back();54 auto mx1 = NEG_INF, mx2 = NEG_INF, mn1 = POS_INF, mn2 = POS_INF;55 for (const auto& v : adj[u]) {56 const auto& x = (v != p) ? dp[v] : t;57 tie(mx1, mx2) = top2(mx1, mx2, x, [](int64_t a, int64_t b) { return a > b; });58 tie(mn1, mn2) = top2(mn1, mn2, x, [](int64_t a, int64_t b) { return a < b; });59 }60 result = min(result, (mx1 != NEG_INF ? (2 * mx1 - mn1) : 0) + baseTime[u]);61 for (const auto& v : adj[u]) {62 if (v == p) {63 continue;64 }65 const auto& mx = (dp[v] != mx1) ? mx1 : mx2;66 const auto& mn = (dp[v] != mn1) ? mn1 : mn2;67 stk.emplace_back(v, u, (mx != NEG_INF ? (2 * mx - mn) : 0) + baseTime[u]);68 }69 }70 return result;71 };72 73 for (const auto& e : edges) {74 adj[e[0]].emplace_back(e[1]);75 adj[e[1]].emplace_back(e[0]);76 }77 iter_dfs();78 return iter_dfs2();79 }80};81 82838485class Solution2 {86public:87 long long finishTime(int n, vector<vector<int>>& edges, vector<int>& baseTime) {88 static const auto& NEG_INF = numeric_limits<int64_t>::min();89 static const auto& POS_INF = numeric_limits<int64_t>::max();90 91 vector<vector<int>> adj(n);92 vector<int64_t> dp(n);93 const auto dfs = [&](this auto&& dfs, int u, int p) -> void {94 auto mx = NEG_INF, mn = POS_INF;95 for (const auto& v : adj[u]) {96 if (v == p) {97 continue;98 }99 dfs(v, u);100 mx = max(mx, dp[v]);101 mn = min(mn, dp[v]);102 }103 dp[u] = (mx != NEG_INF ? (2 * mx - mn) : 0) + baseTime[u];104 };105 106 auto result = POS_INF;107 const auto dfs2 = [&](this auto&& dfs2, int u, int p, int64_t t) -> void {108 const auto top2 = [](int64_t a, int64_t b, int64_t x, auto cmp) -> pair<int64_t, int64_t> {109 if (cmp(x, a)) {110 b = a;111 a = x;112 } else if (cmp(x, b)) {113 b = x;114 }115 return {a, b};116 };117 118 auto mx1 = NEG_INF, mx2 = NEG_INF, mn1 = POS_INF, mn2 = POS_INF;119 for (const auto& v : adj[u]) {120 const auto& x = (v != p) ? dp[v] : t;121 tie(mx1, mx2) = top2(mx1, mx2, x, [](int64_t a, int64_t b) { return a > b; });122 tie(mn1, mn2) = top2(mn1, mn2, x, [](int64_t a, int64_t b) { return a < b; });123 }124 result = min(result, (mx1 != NEG_INF ? (2 * mx1 - mn1) : 0) + baseTime[u]);125 for (const auto& v : adj[u]) {126 if (v == p) {127 continue;128 }129 const auto& mx = (dp[v] != mx1) ? mx1 : mx2;130 const auto& mn = (dp[v] != mn1) ? mn1 : mn2;131 dfs2(v, u, (mx != NEG_INF ? (2 * mx - mn) : 0) + baseTime[u]);132 }133 };134 135 for (const auto& e : edges) {136 adj[e[0]].emplace_back(e[1]);137 adj[e[1]].emplace_back(e[0]);138 }139 dfs(0, -1);140 dfs2(0, -1, NEG_INF);141 return result;142 }143};144