牛客周赛 Round 90——Tk的染色树

题目

Tk的染色树

题解

这题是一个诈骗题,我们可以分析一下,如果有一棵树,选择两个叶子节点进行染黑,这样的操作会比不选择叶子节点染黑然后加上单独染叶子节点效果更好,所以我们只需要每次选择两个叶子节点染黑即可,偶数就是所有叶子节点之和,但是如果是奇数呢,还有一些是没有染黑的,那我们只需要找到树上权值最小的和他构成路径即可,我们通过分析可以得到这个权值最小的点始终存在,也就是总有一种方案会使最后一个叶子节点和这个权值最小的点构成的路径把所有剩余的白色点染黑。通过分析我们可以知道,如果是奇数个叶子节点,最终结果就是叶子节点权值之和加上那个权值最小的值;如果是偶数个叶子节点,最终结果就是叶子节点权值之和,注意,它如果本来就被染黑就不会再变白,不是反转操作,所以才会有这个结论。

参考代码

#include<iostream>
using namespace std;
const int N = 2e5 + 10;
int n;
int a[N];
int deg[N];
int main() {
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        deg[u]++;
        deg[v]++;
    }
    
    int cnt = 0, mn = 1e9;
    long long ans = 0;
    for(int i = 1; i <= n; i++) {
        if(deg[i] <= 1) {
            ans += a[i];
            cnt++;
        }
        mn = min(mn, a[i]);
    }
    
    if(cnt % 2) ans += mn;
    cout << ans << endl;
    return 0;
}
posted @ 2025-04-21 18:54  PZnwbh  阅读(42)  评论(0)    收藏  举报