根据题目给出的条件,
一个人可以有多个下属,但一个人最多只能有一个上级。
可以得出其实是一棵树。我们要求的其实就是从根节点到每一个节点的代价,这个代价是根节点到这个节点的边权加上这个节点的点权。
所以只需要进行一次dfs,dfs的过程中记录边权,然后计算每个点的代价的时候加上这个点的点权就可以了。
#include<iostream>
#include<vector>
using namespace std;
const int MAXN = 2e5+10;
int a[MAXN];
vector<pair<int,int> > G[MAXN];
int ans;
void dfs(int now,int sum)
{
ans = max(ans,a[now]+sum);
for(int i = 0 ; i < G[now].size() ; i ++)
{
dfs(G[now][i].first,sum+G[now][i].second);
}
}
int main()
{
int n;
cin >> n;
for(int i = 2 ; i <= n ; i++){cin >>a[i];}
for(int i = 1 ; i < n ; i++)
{
int x,y,k;
cin >> x>>y>>k;
G[x].push_back(make_pair(y,k));
}
dfs(1,0);
cout<<ans<<endl;
return 0;
}
京公网安备 11010502036488号