给一棵树,每个点有权值,让选择点,要求选择不相邻的点,求使得权值最大,在使得权值最大的情况下,求选择的点中最小的权值最大是多少
#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;
}