链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
小沙转生成为了蚂蚁子,现在他攻占了一颗树,树里面还是实心的木头,所以小沙想要将里面连续的一部分掏空让自己居住(因为小沙只想住一个家)。但是并不是每个部分都适合开采,某些地方的开采后可能导致舒适度下降。
将上面的问题抽象出来,我们可以理解成,给定你一个n个节点的树,你需要在树上选取一个非空连通块,使其舒适度和最大。选择的边和点的舒适度都是舒适度。
输入描述:
第一行输入一个正整数数n≤105n\leq 10^5n≤105
第二行输入n个数 每个数代表该节点开采后的舒适度−109≤ai≤109-10^9\leq a_i\leq 10^9−109≤ai≤109
随后n-1行每行输入3个数x,y,w分别代表x与y之间有一条舒适度为w的路
1≤x,y≤n,−109≤w≤1091\leq x,y\leq n,-10^9\leq w\leq 10^91≤x,y≤n,−109≤w≤109
输出描述:
输出小沙的家的最大舒适度
思路:类似于树上的“最大子段和”,考虑树形DP,容易想到以任一节点为根得出的答案不变。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000010;
ll n,x;
ll ans=-1e18;
int a[N];
char s[N];
ll d