42ptWA
查看原帖
42ptWA
326254
LonginusMonkey楼主2023/9/27 21:28

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;
}
2023/9/27 21:28
加载中...