传送门
题意:
思路:
相当于换根dp的裸题吧,和P3478 [POI2008]STA-Station基本一样
不同点就是,这个题每个结点的权值为wi
代码:
ll dep[MAXN],sz[MAXN],fath[MAXN],dfn[MAXN];
ll w[MAXN];
ll ans[MAXN];
ll sum;
vector<int>p[MAXN];
void dfs(int x,int fa){
dep[x]=dep[fa]+1;
fath[x]=fa;
sz[x]=w[x];
for(auto y:p[x]){
if(y==fa)continue;
dfs(y,x);
sz[x]+=sz[y];
}
}
void dfs2(int x,int fa){
for(auto &v:p[x]){
if(v==fa)continue;
ans[v]=ans[x]+sum-2*sz[v];
dfs2(v,x);
}
}
int main()
{
std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t,n;
cin>>t;
while(t--){
cin>>n;
sum=0;
rep(i,1,n)cin>>w[i],sum+=w[i],p[i].clear();
dep[0]=0;
for(int i=1;i<=n-1;i++){
int u,v;
cin>>u>>v;
p[u].pb(v);
p[v].pb(u);
}
dfs(1,0);
ll lp=0;
for(int i=1;i<=n;i++){
lp+=(dep[i])*w[i];
}
ans[1]=lp;
dfs2(1,0);
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
return 0;
}