【2020.11.30提升組模擬】刪邊(delete)

刪邊(delete)

題目

題目描述

給你一棵n個結點的樹,每一個結點有一個權值,刪除一條邊的費用爲該邊鏈接的兩個子樹中結點權值最大值之和。現要刪除樹中的全部邊,刪除邊的順序能夠任意設定,請計算出全部方案中的最小花費。spa

輸入格式

輸入文件名爲 delete.in。
第一行包含整數n,表示結點數。結點用從1到n表示。
第二行包含n個整數ti(1≤ti≤109)。數字ti表示結點i的權值。
接下來n−1行,每行包含兩個整數x和y(1≤x,y≤n),表示結點x和結點y直接相連。code

輸出格式

輸出文件名爲 delete.out。
輸出最小花費。string

題解

題目大意:有一棵樹,刪去一條邊的代價是這條邊兩端子樹裏各自權值最大值之和,安排刪邊順序使得代價最小,輸出最小代價
一道結論題,沒什麼好說的
\(ans=\sum t_{i}-\max \left\{t_{i}\right\}+\sum \max \left(t_{x_{i}}, t_{y_{i}}\right)\)
證實自行思考it

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll n,x,y,ans,mx,c[100001];
int main()
{
	freopen("delete.in","r",stdin);
	freopen("delete.out","w",stdout);
	scanf("%lld",&n);
	for (int i=1;i<=n;++i)
		scanf("%lld",&c[i]),ans+=c[i],mx=max(mx,c[i]);
	for (int i=1;i<n;++i)
	{
		scanf("%lld%lld",&x,&y);
		ans+=max(c[x],c[y]);
	}
	printf("%lld\n",ans-mx);
	fclose(stdin);
	fclose(stdout);
	return 0;
}
相關文章
相關標籤/搜索