暴力搜索+剪枝直接过,和一个简单的dp思想有点关系,就是那个最大连续子序列和
#include <bits/stdc++.h>
using namespace std;
const int maxn=100009;
vector<pair<int ,int>>g[maxn];
int a[maxn];
int dfs(int k,int fa)
{
// printf("%d %d\n",k,fa);
//getchar();
int ans=0;
for(int i=0;i<g[k].size();i++)
{
int tmp=a[g[k][i].first]-a[k]-g[k][i].second;
if(fa==g[k][i].first||ans+tmp<0)continue;
ans=max(ans,dfs(g[k][i].first,k)+tmp);
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int max1=0;
int n,x,y,z;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),g[i].clear();
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
g[x].push_back(make_pair(y,z));
g[y].push_back(make_pair(x,z));
}
for(int i=1;i<=n;i++)
{
max1=max(max1,dfs(i,0));
}
printf("%d\n",max1);
}
return 0;
}