使用Floyed+暴力就能过
代码只有27行:
#include<bits/stdc++.h>
using namespace std;
int p[110],g[110][110];
int main() {
int n,lc,rc,sum,minn=INT_MAX;
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(i==j) g[i][j]=0;
else g[i][j]=1000;
for(int i=1;i<=n;++i) {
scanf("%d",p+i);
scanf("%d%d",&lc,&rc);
if(lc!=0) g[i][lc]=g[lc][i]=1;
if(rc!=0) g[i][rc]=g[rc][i]=1;
}
for(int k=1;k<=n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
for(int i=1;i<=n;++i) {
sum=0;
for(int j=1;j<=n;++j) sum+=p[j]*g[i][j];
minn=min(minn,sum);
}
printf("%d",minn);
return 0;
}