根据题目给出的条件,
一个人可以有多个下属,但一个人最多只能有一个上级。
可以得出其实是一棵树。我们要求的其实就是从根节点到每一个节点的代价,这个代价是根节点到这个节点的边权加上这个节点的点权。
所以只需要进行一次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; }