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;}

posted @ 2014-09-26 11:11  HYDhyd  阅读(139)  评论(0编辑  收藏  举报