P1268-树的重量【图论】

版权声明:原创,未经作者允许禁止转载 https://blog.csdn.net/Mr_wuyongcong/article/details/88068412

正题


题目大意

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


解题思路

我们考虑每次加入一个节点。两个节点时不用说。
加入第三个节点时,肯定是加入在节点1和节点2之间。

之后我们开始推导:当我们加入节点 n n 时,我们可以考虑加入在 1 x ( x [ 2.. n 1 ] ) 1\sim x(x\in [2..n-1]) 之间。

为什么一定是从1开始,我们考虑是否有可能加入在 x y x\sim y 的路径直接,其实没有必要,因为如果加入在这两个点之间,那么考虑加入到 1 x 1\sim x 1 y 1\sim y 的结果是一样的。所以之间起点定义为 1 1 就好了。


c o d e code

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

猜你喜欢

转载自blog.csdn.net/Mr_wuyongcong/article/details/88068412