rt,用的是正常求重心方法,感觉和题解区的大佬们有些不同,但自己变了几组数据都是对的,帮帮蒟蒻吧!
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e6;
int n,a,b,dep[N],dt[N],ct,bh;
long long ans,sum,f[N],siz[N];
bool vis[N],iq[N];
vector <int> vt[N];
void gc(int nw,int fa){
siz[nw]=dt[nw];
for(int i=0;i<vt[nw].size();i++){
int u=vt[nw][i];
if(u==fa) continue;
gc(u,nw);
siz[nw]+=siz[u];
f[nw]=max(f[nw],siz[u]);
}
f[nw]=max(f[nw],sum-siz[nw]);
}
queue <int> q;
void bfs(){
int nw;
while(q.size()){
nw=q.front();
q.pop();
if(vis[nw]) continue;
vis[nw]=1;
ans+=dt[nw]*dep[nw];
for(int i=0;i<vt[nw].size();i++){
int u=vt[nw][i];
dep[u]=dep[nw]+1;
q.push(u);
}
}
}
signed main(){
cin>>n;
for(int i=1;i<n;i++){
cin>>a>>b;
vt[a].push_back(b);
vt[b].push_back(a);
}
for(int i=1;i<=n;i++){
cin>>dt[i];
sum+=dt[i];
}
gc(1,-1);
ct=1e9,bh=1;
for(int i=1;i<=n;i++){
if(f[i]<ct) ct=f[i],bh=i;
}
dep[bh]=0;
q.push(bh);
bfs();
cout<<ans;
return 0;
}