正题
题目大意
一棵树有nnn个叶子节点,给出每两个叶子节点之间的距离。求这棵树的边权之和。
解题思路
我们考虑每次加入一个节点。两个节点时不用说。
加入第三个节点时,肯定是加入在节点1和节点2之间。
之后我们开始推导:当我们加入节点nnn时,我们可以考虑加入在1∼x(x∈[2..n−1])1\sim x(x\in [2..n-1])1∼x(x∈[2..n−1])之间。
为什么一定是从1开始,我们考虑是否有可能加入在x∼yx\sim yx∼y的路径直接,其实没有必要,因为如果加入在这两个点之间,那么考虑加入到1∼x1\sim x1∼x和1∼y1\sim y1∼y的结果是一样的。所以之间起点定义为111就好了。
codecodecode
#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);}
}