From e97d696f7c0e04b422727be6d3897d3900c1fbd5 Mon Sep 17 00:00:00 2001 From: chayan das <110921638+Chayandas07@users.noreply.github.com> Date: Mon, 24 Feb 2025 22:26:45 +0530 Subject: [PATCH] Create 2467. Most Profitable Path in a Tree --- 2467. Most Profitable Path in a Tree | 73 ++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 2467. Most Profitable Path in a Tree diff --git a/2467. Most Profitable Path in a Tree b/2467. Most Profitable Path in a Tree new file mode 100644 index 0000000..a76fcf4 --- /dev/null +++ b/2467. Most Profitable Path in a Tree @@ -0,0 +1,73 @@ +class Solution { + int midNode = -1; + +public: + void findParent(int node, int par, vector adj[], unordered_map &mp) { + mp[node] = par; + for (auto i : adj[node]) { + if (i != par) { + findParent(i, node, adj, mp); + } + } + } + + void dfs(int node, int par, int sum, vector adj[], vector &amount, vector &dist, vector &leaf, vector &zeroNodes) { + bool isLeaf = true; + dist[node] = sum; + for (auto i : adj[node]) { + if (i != par) { + isLeaf = false; + if (i == midNode) { + dfs(i, node, sum + (amount[i] / 2), adj, amount, dist, leaf, zeroNodes); + } else if (zeroNodes[i]) { + dfs(i, node, sum, adj, amount, dist, leaf, zeroNodes); + } else { + dfs(i, node, sum + amount[i], adj, amount, dist, leaf, zeroNodes); + } + } + } + leaf[node] = isLeaf; + } + + int mostProfitablePath(vector> &edges, int bob, vector &amount) { + int n = edges.size() + 1; + vector adj[n]; + for (auto e : edges) { + adj[e[0]].push_back(e[1]); + adj[e[1]].push_back(e[0]); + } + + unordered_map parent; + findParent(0, -1, adj, parent); + + vector bobNodes; + + do { + bobNodes.push_back(bob); + bob = parent[bob]; + } while (bob != -1); + + if (bobNodes.size() % 2 == 1) { + midNode = bobNodes[bobNodes.size() / 2]; + } + + vector zeroNodes(n, 0); + for (int i = 0; i < bobNodes.size(); i++) { + if (i < bobNodes.size() / 2) { + zeroNodes[bobNodes[i]] = 1; + } + } + + vector dist(n, INT_MIN), leaf(n); + dfs(0, -1, amount[0], adj, amount, dist, leaf, zeroNodes); + + int ans = INT_MIN; + for (int i = 0; i < n; i++) { + if (leaf[i]) { + ans = max(ans, dist[i]); + } + } + + return ans; + } +};