Gem 气垫车(树形dp)

简介: 笔记

题目描述


给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数


唯一的限制条件是相临的两个结点不能标上相同的权值,要求一种方案,使得整棵树的总价值最小。


输入格式


先给出一个数字N,代表树上有N个点,N<=10000


下面N-1行,代表两个点相连


输出格式


最小的总权值


输入输出样例


输入 #1


10

7 5

1 2

1 7

8 9

4 1

9 7

5 6

10 2

9 3


输出 #1


14


思路


可以证明(1、2、3、4)就足够赋值了,因为要取最小权值。(证明略,这里有证明)

4.png

int h[N], e[M], ne[M], idx;
int dp[N][5];
int ans = 2e17;
void add(int a, int b) {
  e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void dfs(int u, int f) {
  for (int i = 1; i <= 4; i++) dp[u][i] = i;
  for (int i = h[u]; ~i; i = ne[i]) {
    int j = e[i];
    if(j == f) continue;
    dfs(j, u);
    for (int k = 1; k <= 4; k++) {
      int s = 2e17;
      for (int p = 1; p <= 4; p++) 
        if(k != p) s = min(s, dp[j][p]);
      dp[u][k] += s;
    }
  }
}
// https://www.luogu.com.cn/problem/P4395
void solve() {
  int n; cin >> n;
  memset(h, -1, sizeof h);
  for (int i = 0; i < n - 1; i++) {
    int a, b; cin >> a >> b;
    add(a, b), add(b, a);
  }
  dfs(1, 0);
  for (int i = 1; i <= 4; i++) {
    ans = min(ans, dp[1][i]);
  }
  cout << ans << endl;
}
相关文章
|
10天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1211 5
|
9天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1173 87
|
9天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1768 12
|
19天前
|
人工智能 运维 安全
|
2天前
|
资源调度
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
230 127
|
10天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
362 0

热门文章

最新文章