首页 > 其他分享 >[HAOI2015] 树上染色

[HAOI2015] 树上染色

时间:2024-10-10 22:11:25浏览次数:7  
标签:sz val int 染色 son HAOI2015 树上 节点 dp

原题链接
\(首先注意到用点维护dp值非常地难做\)
\(我们无法通过点直接维护树上的每个节点的染色\)
\(因为这样做的复杂度为 O(2^n)\)
\(我们考虑到通过枚举边来处理\)
\(对于每条边 枚举它两边的黑色和白色节点数\)
\(那么对该条边被经过的数量为两边的黑色节点数和白色节点数的乘积\)
\(该算法理论最坏复杂度为O(n(m^2))\)
\(但是有个非常大的除数所以能够通过\)
\(code:\)

点击查看代码
#include<bits/stdc++.h>

#define int long long
using namespace std;
#define pb push_back
#define pii pair<int,int>
const int N = 2005;
int sz[N];
int dp[N][N];

void solve() {
    int n, m;
    cin >> n >> m;
    if (n - m < m)m = n - m;
    vector<vector<pii>> G(n + 1, vector<pii >());
    memset(dp, -1, sizeof(dp));
    for (int i = 1; i < n; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        G[u].pb({v, w});
        G[v].pb({u, w});
    }
    function<void(int, int)> dfs = [&](int x, int fa) {
        sz[x] = 1;
        dp[x][0] = dp[x][1] = 0;
        for (auto &[son, val]: G[x]) {
            if (son == fa)continue;
            dfs(son, x);
            sz[x] += sz[son];
            for (int j = min(m, sz[x]); j >= 0; --j) {
                if (dp[x][j] != -1)
                    dp[x][j] += dp[son][0] + sz[son] * (n - m - sz[son]) * val;
                for (int k = min(j, sz[son]); k; k--) {
                    if (dp[x][j - k] == -1)continue;
                    int ans = (k * (m - k) + (sz[son] - k) * (n - m - sz[son] + k)) * val;
                    dp[x][j] = max(dp[x][j], dp[x][j - k] + dp[son][k] + ans);
                }

            }
        }
    };
    dfs(1, -1);
    cout << dp[1][m];
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    solve();
}

标签:sz,val,int,染色,son,HAOI2015,树上,节点,dp
From: https://www.cnblogs.com/archer233/p/18457295

相关文章

  • 林史·树上的男爵 2 | 3
    5我们还没介绍过涛哥居住的城堡呢涛哥所在的城堡是一个不算很大,但是人比较多的城堡,城堡里除了B先生,好像只有一个厨师,两个人轮流来看守城堡里的秩序这个城堡不能算太差,可惜它有太多莫名奇妙的规章制度每天早上,城堡里的人都要在城堡外举行神秘的热身仪式来开启新的一天,回到城......
  • 二分图的判定-染色法
    二分图如果一张无向图的N个节点可以分成A.B两个不相交的非空集合,并且同一集合内的点之间没有边相连,那么称该无向图为二分图(BipartiteGraph)。定理:二分图不存在奇环(长度为奇数的环)。因为每一条边都是从一个集合走到另一个集合,只有走偶数次才可能回到同一个集合。染色......
  • 树上深度和问题 - 换根DP
    问题引出:给出\(n\)个点的树,求出分别以不同的\(i\)为根时,所有结点深度的和,根节点的深度为\(0\)。首先我们有个自然的暴力思路,也就是以每个节点为根节点做一遍\(dfs\)这样的复杂度是\(O(n^2)\)级别的,所以要进行优化看下图:我们首先假设每个节点具有点权,明显这......
  • 树上最值路径 题解
    题意简述给你一棵\(n\)个结点的树,编号为\(1\simn\),求有多少路径\(\operatorname{Path}(u\rightarrowv)\),满足\(u=\max\{x\midx\in\operatorname{Path}(u\rightarrowv)\}\),\(v=\min\{x\midx\in\operatorname{Path}(u\rightarrowv)\}\)。......
  • 树上的差分
    1.点的差分    求路径u-v上的点被经过的次数。    cnt[ x]代表点x经过的次数。    核心代码:cnt[n]++;cnt[v]++;cnt[lca]--;cnt[fa[lca]]--; 2.边的差分    求u-v路径上每一条边经过的次数。    cnt[ x......
  • 林史·树上的男爵 2 | 中
    3涛哥在树上的生活也并不总是一帆风顺的,毕竟是在野外,就算有时候找不到吃的或者水源,但这些危险比起大自然的种种威胁来,还是太过逊色了涛哥发现,并不是所有的线段树都能够比作水井,有些线段树积极的很,一有操作马上就会下放,但是有的线段树就像睡着了一样,使劲踹它两脚,它才像挤牙膏一样......
  • 树上问题学习
    T1题面有一个\(n\)个节点的树,根节点为\(1\),令叶子节点数为\(m\),叶子节点的权值为一个\(1\)到\(m\)的排列。Alice和Bob在树上玩游戏,两人从根节点开始,Alice先手的轮流的行走\(u\to\text{son}(u)\)的路径直到抵达叶子节点。叶子的权值为本次游戏的得分。Alice希望最大......
  • 林史·树上的男爵 2 | 上
    1在涛哥12岁之前,一切都像正常人平静的生活一般,涛哥正常地在房间里敲代码,正常地打模拟赛,正常地改题,正常地写闲话直到涛哥十二岁的时候,一切都变了那天上午,我完全没有意识到接下来的一天会发生什么,因为涛哥仍然像往常一样在房间里和我们聊天B先生出现了,说自己身为国家之重臣,需......
  • 教授(优青)团队一站式指导:专业实验设计、数据分析、SCI论文辅助。基因表达分析、转录因
    可高通量检测组蛋白不同修饰在基因组上的位点;可用于模式物种和非模式物种的研究,无需特异性抗体;完整的DAP-seq解决方案。DAP-seq可高通量检测转录因子或DNA结合蛋白在基因组上的结合位点;可用于模式物种和非模式物种的研究,无需特异性抗体;完整的基因功能分析解决方案......
  • 染色法判定二分图
    给定一个 nn 个点 mm 条边的无向图,图中可能存在重边和自环。请你判断这个图是否是二分图。输入格式第一行包含两个整数 nn 和 mm。接下来 mm 行,每行包含两个整数 uu 和 vv,表示点 uu 和点 vv 之间存在一条边。输出格式如果给定图是二分图,则输出 Yes,否则......