WA了6,8,9,11,12,13,14,15
求助,思路是基环树dp,拆掉一条边然后强行选一点,和不选一点。做二次dfs
#include<bits/stdc++.h>
#define int long long
#define inf -1e9
#define maxn 100100
using namespace std;
int n; int arr[maxn];
vector<int> vec[maxn];
int vis[maxn], bl, from, to;
int ti = 0;
void dfs(int index, int fa) {
if(bl) {
return;
}
vis[index] = 1;
for(int i=0; i<vec[index].size(); ++i) {
if(vec[index][i] == fa) {
continue;
}
if(vis[vec[index][i]]) {
to = vec[index][i], from = index;
bl = 1;
return;
}
dfs(vec[index][i], index);
}
}
int dp[maxn][2];
void dfs_ans(int index, int fa) {
dp[index][0] = arr[index];
for(int i=0; i<vec[index].size(); ++i) {
if(vec[index][i] == fa) {
continue;
}
if(index == from && vec[index][i] == to || index == to && vec[index][i] == from) {
continue;
}
dfs_ans(vec[index][i], index);
dp[index][0] += dp[vec[index][i]][1];
dp[index][1] += max(dp[vec[index][i]][0], dp[vec[index][i]][1]);
}
if(ti == 1 && index == to) {
dp[index][0] = dp[index][1];
}
if(ti == 2 && index == from) {
dp[index][0] = dp[index][1];
}
}
signed main() {
// ios::sync_with_stdio(0); cin.tie(0);
cin >> n; for(int i=0; i<n; ++i) {
cin >> arr[i];
}
for(int i=1; i<=n; ++i) {
int u, v; cin >> u >> v;
vec[u].push_back(v); vec[v].push_back(u);
}
double k; cin >> k;
dfs(0, -1);
double ans = 0; ti = 1;
dfs_ans(from, -1);
ans = max(ans, double(dp[from][0]) * k);
memset(dp, 0, sizeof dp); ti = 2;
dfs_ans(to, -1);
ans = max(ans, double(dp[to][0]) * k);
printf("%.1lf", ans);
return 0;
}