莫名奇妙 在第九个点 第一个dfs会死循环
#include <cstdio>
#include <iostream>
#define S 1000005
#define int long long
using namespace std;
int n;
int zhi[S];
struct kMM {
int ne,to,val;
} e[S*2];
int h[S],cnt;
void add(int u,int v,int val) {
e[++cnt].ne=h[u];
e[cnt].to=v;
e[cnt].val=val;
h[u]=cnt;
}
int sz[S],f[S];
void ddd(int u,int fa) {
sz[u]=zhi[u];
for(int i=h[u]; i; i=e[i].ne) {
int v=e[i].to;
if(v==fa)continue;
ddd(v,u);
sz[u]+=sz[v];
f[u]+=f[v]+e[i].val*sz[v];
}
//cout<<u<<" "<<" f[u]="<<f[u]<<endl;
}
int dp[S],ans=0x3f3f3f3f3f3f;
void dfs(int u,int fa) {
ans=min(ans,dp[u]);
for(int i=h[u]; i; i=e[i].ne) {
int v=e[i].to;
if(v==fa)continue;
dp[v]=dp[u]+e[i].val*(sz[u]-2*sz[v]);
int tmp=sz[u];
sz[u]=sz[u]-sz[v];
sz[v]=tmp;
// cout<<"v="<<v<<"u="<<u<<" "<<dp[v]<<" "<<e[i].val*(sz[u]-2*sz[v])<<" sz[u]="<<sz[u]<<" sz[v]="<<sz[v]<<endl;
dfs(v,u);
sz[u]=tmp;
}
}
int xx,yy,zz;
signed main() {
freopen("a.in.txt","r",stdin);
freopen("a.out","w",stdout);
scanf("%lld",&n);
for(int i=1; i<=n; ++i)scanf("%lld",&zhi[i]);
for(int i=1; i<n; ++i) {
scanf("%lld%lld%lld",&xx,&yy,&zz);
add(xx,yy,zz);
add(yy,xx,zz);
}
ddd(1,-1);
dp[1]=f[1];
dfs(1,-1);
printf("%lld\n",ans);
return 0;
}