[COCI2020-2021#2] Sjekira 题解
fengenrong · · 题解
根据题目我们可以发现最优解为:先将权值大的的顶点优先与和它连接的点删除。
所以我们就得到了一个时间复杂度
证明:因为每一个点至少要和其它数合并一次,所以
Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,sum,maxa,a[1000005]/*权值*/;
signed main()
{
cin>>n;//输入
for(register int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];//总和
maxa=max(a[i],maxa);//最大值
}
sum-=maxa;//利用公式
for(register int i=1;i<=n-1;i++)
{
int x,y;
cin>>x>>y;
sum+=max(a[x],a[y]);//利用公式
}
cout<<sum;
return 0;
}