sdibt 1251 进化树问题
/* 三个点的话 A--D--B | C dis(AD)=(AB+AC-BC)/2; 拓展到到n个点 每次去叶子节点,先去掉与A相连长度最小的。 将他们的长度加起来。 */ #include<stdio.h> #define N 110 int ma[N][N]; int main() { int n,m,i,j,k,minn,f; while(scanf("%d",&n)!=EOF) { for(i=1;i<n;i++) for(j=i+1;j<=n;j++){ scanf("%d",&ma[i][j]); ma[j][i]=ma[i][j]; } minn=-1; m=0; for(i=1;i<=n-2;i++) { j=i+1; minn=-1; for(k=j+1;j<=n;j++) { f=(ma[i][j]+ma[i][k]-ma[j][k])/2; if(minn<0||f<minn)minn=f; } m+=minn; } m+=ma[n-1][n]; printf("%d\n",m); } return 0;}