Skip to content

Commit 358539b

Browse files
authored
Create 2467. Most Profitable Path in a Tree (#725)
2 parents b4c6266 + e97d696 commit 358539b

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

2467. Most Profitable Path in a Tree

+73
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
class Solution {
2+
int midNode = -1;
3+
4+
public:
5+
void findParent(int node, int par, vector<int> adj[], unordered_map<int, int> &mp) {
6+
mp[node] = par;
7+
for (auto i : adj[node]) {
8+
if (i != par) {
9+
findParent(i, node, adj, mp);
10+
}
11+
}
12+
}
13+
14+
void dfs(int node, int par, int sum, vector<int> adj[], vector<int> &amount, vector<int> &dist, vector<int> &leaf, vector<bool> &zeroNodes) {
15+
bool isLeaf = true;
16+
dist[node] = sum;
17+
for (auto i : adj[node]) {
18+
if (i != par) {
19+
isLeaf = false;
20+
if (i == midNode) {
21+
dfs(i, node, sum + (amount[i] / 2), adj, amount, dist, leaf, zeroNodes);
22+
} else if (zeroNodes[i]) {
23+
dfs(i, node, sum, adj, amount, dist, leaf, zeroNodes);
24+
} else {
25+
dfs(i, node, sum + amount[i], adj, amount, dist, leaf, zeroNodes);
26+
}
27+
}
28+
}
29+
leaf[node] = isLeaf;
30+
}
31+
32+
int mostProfitablePath(vector<vector<int>> &edges, int bob, vector<int> &amount) {
33+
int n = edges.size() + 1;
34+
vector<int> adj[n];
35+
for (auto e : edges) {
36+
adj[e[0]].push_back(e[1]);
37+
adj[e[1]].push_back(e[0]);
38+
}
39+
40+
unordered_map<int, int> parent;
41+
findParent(0, -1, adj, parent);
42+
43+
vector<int> bobNodes;
44+
45+
do {
46+
bobNodes.push_back(bob);
47+
bob = parent[bob];
48+
} while (bob != -1);
49+
50+
if (bobNodes.size() % 2 == 1) {
51+
midNode = bobNodes[bobNodes.size() / 2];
52+
}
53+
54+
vector<bool> zeroNodes(n, 0);
55+
for (int i = 0; i < bobNodes.size(); i++) {
56+
if (i < bobNodes.size() / 2) {
57+
zeroNodes[bobNodes[i]] = 1;
58+
}
59+
}
60+
61+
vector<int> dist(n, INT_MIN), leaf(n);
62+
dfs(0, -1, amount[0], adj, amount, dist, leaf, zeroNodes);
63+
64+
int ans = INT_MIN;
65+
for (int i = 0; i < n; i++) {
66+
if (leaf[i]) {
67+
ans = max(ans, dist[i]);
68+
}
69+
}
70+
71+
return ans;
72+
}
73+
};

0 commit comments

Comments
 (0)