第一个点测试输出‘0’,本地是正确答案4,
(可以用在线IDE看下)
样例: 3 1 2 3 2 0 0 2 0 0
(也有可能直接找树的重心,再统计答案的方法是错的……, 希望dalao帮忙指正QWQ
#include<bits/stdc++.h>
#define inf 0x3f3f3f
#define M 1001
using namespace std;
inline int read(){
int x=0;int f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){ x=x*10+ch-'0';ch=getchar(); }
return x*f;
}
int n,a[M];
int sz[M],f[M];
struct Node{
int to,nxt;
}e[M<<1];
int cnt=0,head[M<<1];
inline void addl(int fr,int to){
cnt++;
e[cnt].to=to;
e[cnt].nxt=head[fr];
head[fr]=cnt;
}
inline void add(int fr,int to){
addl(fr,to);addl(to,fr);
}
int dis=0;
inline void dfs(int x,int fa){
sz[x]=1;
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa)continue;
dfs(y,x);
sz[x]+=sz[y];
f[x]=max(f[x],sz[y]);
}
f[x]=max(f[x],n-sz[x]);
}
inline void dff(int x,int fa,int dep){
dep++;
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].to;
if(y==fa)continue;
dff(y,x,dep);
dis=dis+dep*a[y];
}
}
int main(){
n=read();
for(int i=1;i<=n;++i){
a[i]=read();
int x=read(),y=read();
if(x!=0)add(i,x);
if(y!=0)add(i,y);
}
dfs(1,0);
int pos,mis=f[1];
for(int i=1;i<=n;++i){
if(f[i]<mis){
pos=i;mis=f[i];
}
}
dff(pos,0,0);
printf("%d",dis);
return 0;
}
(不知所 ┗|`O′|┛ 嗷~~