Tk的染色树
题目链接:https://ac.nowcoder.com/acm/contest/107500/E
题意:
对于一颗给定的树,可以选择一个点花费2 x w[i] 的代价将其染黑
或选择两个点花费 w[i] + w[j] 的代价将这两个点及其简单路径(经过LCA的路径)上的点染黑
求将整棵树染黑所需的最小代价和
思路:
发现选择一个点的代价是w[i]+w[i],所以和选两个点没有区别
观察易得每次都挑选两个叶子节点染黑,能花费尽可能少而使染色尽可能多
(因为叶子节点一定要去染黑,而一个叶子节点到另一个叶子节点路径上包含的节点是最多的)
当叶子节点有偶数个时,答案即它们的wi之和
当叶子节点有奇数个时,发现两两匹配后还剩余一个,因此要加一个树中最小的一个wi
因为贪心地想,总是可以通过改变叶子节点的匹配方式使只剩单独一个叶子节点未染黑
int w[maxn];
// vector<int>e[maxn];
int deg[maxn];
void solve(){
int n;cin>>n;
rep(i,1,n){
cin>>w[i];
}
rep(i,1,n-1){
int u,v;cin>>u>>v;
deg[u]++;deg[v]++;
// e[u].pb(v);e[v].pb(u);
}
int ans=0;
int cnt=0;
int temp;
int mini=inf;
rep(i,1,n){
if(deg[i]==1){
temp=i;
ans+=w[i];
cnt++;
}
mini=min(mini,w[i]);
}
if(cnt&1)ans+=mini;
cout<<ans<<endl;
}

浙公网安备 33010602011771号