P1268 树的重量

链接:https://www.luogu.com.cn/problem/P1268
原题:

思路:
原本的思路是通过最长边构建一棵树,然后通过记录每个横坐标的值来模拟每个边的分支。但是这样做太繁琐而且容易分类讨论失误。
看了题解的一个非常巧妙的办法:类似于求LCA的思路。

事实上感觉就像状态转移?类似于DP里面的一种思路,挺好的,不用管整棵树的样子。
代码:

#include<iostream>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
const int N = 140;
int a[N][N];


signed main()
{
	IOS;
	int n; cin >> n;
	for (int i = 1; i < n; i++)
	{
		for (int j = i + 1; j <= n; j++)
		{
			cin >> a[i][j];
			a[j][i] = a[i][j];
		}
	}
	int ans = a[1][2];
	for(int i=3;i<=n;i++)
	{
		int minn = 0x3f3f3f3f;
		for (int j = 2; j <= i - 1; j++)
		{
			int cal = 0;
			cal = (a[1][i] + a[i][j] - a[1][j]) / 2;
			minn = min(minn, cal);
		}
		ans += minn;
	}
	cout << ans;

	return 0;
}

posted @ 2024-12-21 16:15  WHUStar  阅读(3)  评论(0编辑  收藏  举报