一开始想的是根据不同节点的颜色价值出现的次数和价值大小进行贪心,但没有具体贪心的方法,此路不通。后来发现这道题是个思维题,节点关系为树,任何一个节点都可以到达其他所有的节点,而需要消耗的价值与给定的边也无关。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+100;
ll a[N],vis[N];
map<ll,ll>mp;
int main()
{
ll n,i,j,cnt=0,sum=0;
scanf("%lld",&n);
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
if(mp[a[i]])
vis[++cnt]=a[i];
mp[a[i]]++;
sum+=a[i];
}
for(i=1;i<=n-1;i++)
{
int x,y;
scanf("%d%d",&x,&y);
}
ll ans=1e20;
for(i=1;i<=cnt;i++)
{
//cout<<sum<<" "<<vis[i]*mp[vis[i]]<<" "<<(n-mp[vis[i]]+1)*a[i]<<endl;
ans=min(ans,sum-vis[i]*mp[vis[i]]+(n-mp[vis[i]])*vis[i]);//除了当前价值的节点的其他节点价值和+当前节点出现次数*价值
}
printf("%lld\n",ans);
return 0;
}