版权声明:原创,未经作者允许禁止转载 https://blog.csdn.net/Mr_wuyongcong/article/details/88068412
正题
题目大意
一棵树有 个叶子节点,给出每两个叶子节点之间的距离。求这棵树的边权之和。
解题思路
我们考虑每次加入一个节点。两个节点时不用说。
加入第三个节点时,肯定是加入在节点1和节点2之间。
之后我们开始推导:当我们加入节点 时,我们可以考虑加入在 之间。
为什么一定是从1开始,我们考虑是否有可能加入在 的路径直接,其实没有必要,因为如果加入在这两个点之间,那么考虑加入到 和 的结果是一样的。所以之间起点定义为 就好了。
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[50][50],ans;
int main()
{
while(1)
{
scanf("%d",&n);
if(!n) break;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
scanf("%d",&a[i][j]),a[j][i]=a[i][j];
ans=a[1][2];
for(int i=3;i<=n;i++){
int len=2147483647;
for(int j=2;j<i;j++)
len=min(len,(a[1][i]+a[j][i]-a[1][j])/2);
ans+=len;
}
printf("%d\n",ans);
}
}