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 79 80 81 82 83 84 85 86 87 88
|
#include <bits/stdc++.h> #define debug(x) cerr<<#x<<":"<<x<<"\n";
using namespace std;
using ll = long long; constexpr ll MAXN=(ll)1e6+10;constexpr ll INF=(ll)1e17+9; constexpr ll mod=(ll)1e9+7;constexpr double eps=1e-8;const double pi=acos(-1.0);
ll A[MAXN]; inline void solve(){ ll N;cin>>N; vector<vector<array<ll,2> > > g(N+5); for(int i=2;i<=N;++i){ cin>>A[i]; } for(int i=1;i<=N-1;++i){ ll u,v,w;cin>>u>>v>>w; g[u].push_back({v,w});g[v].push_back({u,w}); } vector<ll> inf,dp(N+5,0); vector<bool> vis(N+5,0),isinf(N+5,0); auto dfs=[&](auto &&self,ll u,ll cur,ll gain,ll de)->void{ vis[u]=true;dp[u]=cur; for(int i=0;i<g[u].size();++i){ ll v=g[u][i][0],w=g[u][i][1]; if(vis[v]) continue; if(cur+gain+A[u]-de>=w){ self(self,v,cur,gain+A[u],de+w); }else{ self(self,v,w-gain-A[u]+de,gain+A[u],de+w); } } for(int i=0;i<g[u].size();++i){ ll w=g[u][i][1],v=g[u][i][0]; if(w*2<A[u]+A[v] && A[u]>=w){ inf.push_back(dp[u]); #ifdef LOCAL debug(w);debug(A[u]);debug(u); #endif break; } } }; dfs(dfs,1,0,0,0); #ifdef LOCAL for(int i=2;i<=N;++i){ cerr<<dp[i]<<" "; } cerr<<"\n"; for(int i=0;i<inf.size();++i){ cerr<<inf[i]<<" "; } cerr<<"\n"; #endif ll mn=inf.empty()?INF:*min_element(inf.begin(),inf.end()); for(int i=2;i<=N;++i){ cout<<min(dp[i],mn)<<" "; } cout<<"\n"; }
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); ll lT; cin>>lT; while(lT--){ solve(); } return 0; }
|