luogu 1364
正解应该是求带权树的重心,然而这个数据范围用Floyed就可以了。
#include"cstdio" #include"cctype" #include"algorithm" using namespace std; const int inf=1000000000; int read() { int c,x=0; while(!isdigit(c=getchar())); while(x=x*10+c-'0',isdigit(c=getchar())); return x; } int p[101],f[101][101]; int main() { int n=read(),ans=inf; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) if(i!=j) f[i][j]=inf; for(int i=1; i<=n; i++) { p[i]=read(); int u=read(),v=read(); f[i][u]=f[u][i]=f[i][v]=f[v][i]=1; } for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) if(i!=k) for(int j=1; j<=n; j++) if(j!=i && j!=k) f[i][j]=min(f[i][j],f[i][k]+f[k][j]); for(int i=1; i<=n; i++) { int tot=0; for(int j=1; j<=n; j++) tot+=f[i][j]*p[j]; ans=min(tot,ans); } printf("%d",ans); return 0; }