题目描述

给出一棵树的叶子节点两两之间的距离,求这棵树的边权和。

题目分析

令 a(i,j) 为叶子 i 到 j 的距离
由于这是一棵树。
n=2 的时候,只有一条链。

n=3 的时候,由于是一棵树,所以 3 肯定连在 1 到 2 的那条链上,那么红边长=(a(1,3)+a(2,3)-a(1,2))/2

n=4 的时候,4 要么连在 1 到 2 的链上,要么连在 1 到 3 的链上(这样 2 到 3 的链已经包括在里面了),所以我们枚举并求最小新边权即可。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<climits>
using namespace std;
int read(){
    int q=0;char ch=' ';
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')q=q*10+ch-'0',ch=getchar();
    return q;
}
int n,ans;
int a[33][33];
int main(){
    int i,j;
    while(1){
        n=read();if(!n)break;
        for(i=1;i<=n;++i)
            for(j=i+1;j<=n;++j)
                a[i][j]=read(),a[j][i]=a[i][j];
        ans=a[1][2];
        for(i=3;i<=n;++i){
            int minn=INT_MAX;
            for(j=2;j<i;++j)
                minn=min(minn,(a[i][j]+a[1][i]-a[1][j])/2);
            ans+=minn;
        }
        printf("%d\n",ans);
    }
    return 0;
}
分类: 文章

litble

苟...苟活者在淡红的血色中,会依稀看见微茫的希望

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注