一道處理的很巧妙的樹狀數組……都是參考大牛的代碼的……
#include<iostream>
#include<vector>
using namespace std;
template<class T> T Max(T x,T y){return x>y?x:y;}
template<class T> T Min(T x,T y){return x<y?x:y;}
#define N 1005
#define inf 999999999
struct node
{
int u,w;
node(int x,int y)
{
u=x,w=y;
}
};
vector<node> v[N];
int n,d[N],w[N],dist[N],best[N],dp[N][N];
void dis(int u)
{
int i,x,len;
len=v[u].size();
for(i=0;i<len;i++)
{
x=v[u][i].u;
if(dist[x]!=-1)continue;
dist[x]=dist[u]+v[u][i].w;
dis(x);
}
}
void dfs(int now,int pre)
{
int i,j,u,len;
len=v[now].size();
for(i=0;i<len;i++)
{
u=v[now][i].u;
if(u==pre)continue;
dfs(u,now);
}
memset(dist,-1,sizeof(dist));
dist[now]=0;
dis(now);
best[now]=inf;
for(i=1;i<=n;i++)
{
if(dist[i]>d[now])
{
dp[now][i]=inf;
continue;
}
dp[now][i]=w[i];
for(j=0;j<len;j++)
{
u=v[now][j].u;
if(u==pre)continue;
dp[now][i]+=Min(best[u],dp[u][i]-w[i]);
}
best[now]=Min(best[now],dp[now][i]);
}
}
int main()
{
//freopen("a.txt","r",stdin);
int t,i,x,y,z;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",w+i);
for(i=1;i<=n;i++)
{
scanf("%d",d+i);
v[i].clear();
}
for(i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
v[x].push_back(node(y,z));
v[y].push_back(node(x,z));
}
dfs(1,0);
printf("%d\n",best[1]);
}
return 0;
}