给出一颗树,要给定每个结点值a[i],结点值两两互不相同,b[i]是结点i的子树中mex(点值),求sum(b)最大,所以考虑0放在哪颗子树,因此其他子树一定全部都是0,所以要取一个最大值
AC代码:
#include <bits/stdc++.h> #define rep(i,a,n) for(int i=a;i<n;i++) using namespace std; using LL = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; rep (oo, 0, T) { int n; cin >> n; vector<vector<LL>> G(n + 1); vector<LL> dp(n + 1), sz(n + 1); for (int i = 0; i < n - 1; i++) { LL u, v; cin >> u >> v; G[u].push_back(v); G[v].push_back(u); } function<void(int, int)> dfs = [&](int u, int fa) { sz[u] = 1; LL maxx = 0; for (auto v : G[u]) { if (v == fa) { continue; } dfs(v, u); sz[u] += sz[v]; maxx = max(maxx, dp[v]); } dp[u] = maxx + sz[u]; }; dfs(1, 0); cout << dp[1] << '\n'; } return 0; }
2022“杭电杯”中国大学生算法设计超级联赛(6) F
这篇博客讨论了一种树形结构的问题,其中每个节点都有一个独特的值。目标是确定如何分配0使得所有子树的mex(未出现的最小值)之和最大。代码实现了一个深度优先搜索(DFS)算法来解决这个问题,通过遍历树并计算每个节点的最大mex值来找到最优解。
摘要由CSDN通过智能技术生成