b_mt_蚂蚁最优战术(简单树形dp)

给一棵树,每个点有权值,让选择点,要求选择不相邻的点,求使得权值最大,在使得权值最大的情况下,求选择的点中最小的权值最大是多少

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
vector<int> g[N];
int a[N], s[N][2], m[N][2];
void dfs(int u, int fa) {
    s[u][1]=a[u];
    m[u][1]=a[u];
    for (int v : g[u]) {
        if (v==fa) continue;
        dfs(v,u);
        s[u][1]+=s[v][0];
        m[u][1]=min(a[u], m[v][0]);
        s[u][0]+=s[v][1];
        m[u][0]=m[v][1];
    }
}
int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n,k; cin>>n>>k;
    for (int i=1; i<=n; i++) cin>>a[i];
    for (int i=0; i<k; i++) {
        int u,v; cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1,0);
    if (s[1][1] > s[1][0]) cout<<s[1][1]<<' '<<m[1][1];
    else cout<<s[1][0]<<' '<<m[1][0];
    return 0;
}
原文地址:https://www.cnblogs.com/wdt1/p/14532881.html