#include <bits/stdc++.h>
using
namespace
std;
int
result = 0;
void
findMaximumPathSum(
int
currentNode,
int
previousNode,
vector<
int
> adj[],
int
A[])
{
vector<
int
> v = adj[currentNode];
int
maximumBranchSum1 = 0;
int
maximumBranchSum2 = 0;
for
(
int
i = 0; i < v.size(); i++) {
if
(v[i] == previousNode) {
continue
;
}
findMaximumPathSum(v[i], currentNode,
adj, A);
if
(A[v[i]] > maximumBranchSum1) {
maximumBranchSum2 = maximumBranchSum1;
maximumBranchSum1 = A[v[i]];
}
else
{
maximumBranchSum2
= max(maximumBranchSum2, A[v[i]]);
}
}
result = max(result,
A[currentNode] + maximumBranchSum1
+ maximumBranchSum2);
A[currentNode] += maximumBranchSum1;
}
void
print(
int
A[],
int
N, pair<
int
,
int
> edges[])
{
vector<
int
> adj[N];
for
(
int
i = 0; i < N - 1; i++) {
int
x = edges[i].first;
int
y = edges[i].second;
adj[x - 1].push_back(y - 1);
adj[y - 1].push_back(x - 1);
}
findMaximumPathSum(0, -1, adj, A);
cout << result << endl;
}
int
main()
{
int
N = 6;
int
A[N] = { 4, -1, -3, 5, 7, -2 };
pair<
int
,
int
> edges[N - 1] = {
{ 1, 2 }, { 1, 3 }, { 2, 4 }, { 2, 5 }, { 2, 6 }
};
print(A, N, edges);
return
0;
}