全 WA 且样例不过代码:
#include<cstdio>
#define ll long long
const int N=405;
int n,cnt,head[N];
ll siz[N],a[N],ans=1e18,dp[N],dep[N];
struct yeah{
int to,nex;
}edge[N];
void add(int u,int v){
cnt++;
edge[cnt].to=v;
edge[cnt].nex=head[u];
head[u]=cnt;
}
void dfs1(int u,int fa){
siz[u]=a[u],dep[u]=dep[fa]+1;
for(int i=head[u];i!=0;i=edge[i].nex){
int v=edge[i].to;
if(v==fa) continue;
dfs1(v,u);
siz[u]+=siz[v];
}
}
void dfs2(int u,int fa){
for(int i=head[u];i!=0;i=edge[i].nex){
int v=edge[i].to;
if(v==fa) continue;
dp[v]=dp[u]+siz[1]-siz[v]*2;
dfs2(v,u);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int u,v;
scanf("%d %d %d",&a[i],&u,&v);
if(u!=0) add(i,u),add(u,i);
if(v!=0) add(i,v),add(v,i);
}
dfs1(1,0);
for(int i=1;i<=n;i++){
dp[1]+=a[i]*dep[i];
}
dfs2(1,0);
for(int i=1;i<=n;i++){
if(dp[i]<ans) ans=dp[i];
}
printf("%lld",ans);
return 0;
}
AC 代码:
#include<cstdio>
#define ll long long
const int N=405;
int n,cnt,dep[N],head[N];
ll siz[N],a[N],ans=1e18,dp[N];
struct yeah{
int to,nex;
}edge[N];
void add(int u,int v){
cnt++;
edge[cnt].to=v;
edge[cnt].nex=head[u];
head[u]=cnt;
}
void dfs1(int u,int fa,int dep){
siz[u]=a[u];
for(int i=head[u];i!=0;i=edge[i].nex){
int v=edge[i].to;
if(v==fa) continue;
dfs1(v,u,dep+1);
siz[u]+=siz[v];
}
dp[1]+=a[u]*dep;
}
void dfs2(int u,int fa){
for(int i=head[u];i!=0;i=edge[i].nex){
int v=edge[i].to;
if(v==fa) continue;
dp[v]=dp[u]+siz[1]-siz[v]*2;
dfs2(v,u);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int u,v;
scanf("%d %d %d",&a[i],&u,&v);
if(u!=0) add(i,u),add(u,i);
if(v!=0) add(i,v),add(v,i);
}
dfs1(1,0,0);
dfs2(1,0);
for(int i=1;i<=n;i++){
if(dp[i]<ans) ans=dp[i];
}
printf("%lld",ans);
return 0;
}
照着题解改的,没看出两份代码有什么区别