[COCI2020-2021#2] Sjekira 題解

PerchLootie發表於2024-06-07

題目大意:把一棵樹完全分解,每次分解一條邊的代價是這條邊連線的兩個連通塊的最大點權之和,求最小代價。

逆序模擬,既然題目要求將樹完全分解,那我們就每次逆序連線當前權值最小的兩個點,也就是貪心的思路。

嘗試將貪心的值寫成一個表示式:

$$ \sum_{i=1}^n a_i+\sum_{(u,v)\in E} \max(a_u,a_v)-\max(a_i) $$

考慮轉化為合併節點,設第一次合併的時候代價為 $a_i$,那如果 $a_i>a_j$​ 就要再操作一次 $a_i$,所以邊加的就是兩個端點的最大值(作為新的連通塊的最大代價的點對答案產生貢獻,但是發現多一項,減一個 $\max(a_i)$ 即可。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll a,s,d[100005],f;
ll ans,sum=-99999;
int main(){
	scanf("%lld",&a);
	for(int i=1;i<=a;i++){
		scanf("%lld",&d[i]);
		ans+=d[i];
		sum=max(sum,d[i]);
	}
	for(int i=1;i<a;i++){
		scanf("%lld%lld",&s,&f);
		ans+=max(d[s],d[f]);
	}
	printf("%lld",ans-sum);
	return 0;
}