1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include <iostream> #include <cstdio> #include <cstring> #include <utility> #include <vector> using namespace std; #define N 1010 #define INF 100000000000LL #define LL long long #define pil pair<int,long long> #define cl(xx,yy) memset((xx),(yy),sizeof((xx))) #define pb push_back #define mp make_pair
int n; LL cost[N],d[N],dp[N][N],best[N],dis[N][N]; vector<pil>e[N];
void cal(int rt,int u,int fa,LL len){ dis[rt][u] = len; for(int i = 0; i < e[u].size(); i++){ int v = e[u][i].first; LL w = e[u][i].second; if(v == fa) continue; cal(rt,v,u,len+w); } }
void dfs(int u,int fa){ for(int i = 0; i < e[u].size(); i++){ int v = e[u][i].first; if(v == fa) continue; dfs(v,u); }
LL Min = INF; for(int k = 1; k <= n; k++){ if(dis[u][k] <= d[u]){ dp[u][k] = 0; for(int i = 0; i < e[u].size(); i++){ int v = e[u][i].first; LL w = e[u][i].second; if(v == fa) continue; dp[u][k] += min(dp[v][k]-cost[k],best[v]); } dp[u][k] += cost[k]; } else dp[u][k] = INF; Min = min(Min,dp[u][k]); } best[u] = Min; }
int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i = 1; i <= n; i++) scanf("%lld",&cost[i]); for(int i = 1; i <= n; i++) scanf("%lld",&d[i]); for(int i = 1; i <= n; i++) e[i].clear(); for(int i = 1; i < n; i++){ int u,v; LL w; scanf("%d%d%lld",&u,&v,&w); e[u].pb(mp(v,w)); e[v].pb(mp(u,w)); } for(int i = 1; i <= n; i++) cal(i,i,-1,0); for(int i = 1; i <= n; i++) best[i] = INF; dfs(1,-1); printf("%lld\n",best[1]); } return 0; }
|