题目链接:点这里

题解:

  需要证明,所求的路径一定是全部权值都为1或者,路径上权值至多有一个为2其余为1且权值2在路径中央。

  然后树形DP

  设定dp[i][0/1] 以1为根的情况下,以i 节点下子树走分别全1和 走一次2和剩余全走1 的最长链

  每遍历一次子树,统计一次答案

  下面给出代码

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define ls i<<1
#define rs ls | 1
#define mid ((ll+rr)>>1)
#define pii pair<int,int>
#define MP make_pair
typedef long long LL;
const long long INF = 1e18+1LL;
const double pi = acos(-1.0);
const int N = 5e5+10, M = 1e3+20,inf = 2e9;
const LL mod = 1e9+7LL;int n,a[N],ans;
int ans1,ans2;
vector<int > G[N];
int dp[N][2];
void dfs(int u,int f) {if(a[u] == 1) dp[u][0] = 1;else if(a[u] == 2) dp[u][1] = 1;for(int i = 0; i < G[u].size(); ++i) {int to = G[u][i];if(to == f) continue;dfs(to,u);ans1 = max(ans1,dp[to][0] + dp[u][0]);ans2 = max(ans2,dp[u][0] + dp[to][1]);ans2 = max(ans2,dp[u][1] + dp[to][0]);if(a[u] > 2)continue;if(a[u] == 1) {dp[u][0] = max(dp[u][0],dp[to][0] + 1);dp[u][1] = max(dp[u][1],dp[to][1] + 1);}else {dp[u][1] = max(dp[u][1],dp[to][0] + 1);}}
}
int main(){scanf("%d",&n);for(int i = 1; i < n; ++i) {int x,y;scanf("%d%d",&x,&y);G[x].push_back(y);G[y].push_back(x);}int mi = inf;for(int i = 1; i <= n; ++i) {scanf("%d",&a[i]);mi = min(mi,a[i]);}ans = 0;dfs(1,0);if(mi >= 2) {printf("%d/1\n",mi);}else {if(2*ans1 > ans2) printf("1/%d\n",ans1);else if(ans2 % 2 == 0) printf("1/%d\n",ans2/2);else printf("2/%d\n",ans2);}return 0;
}

转载于:https://www.cnblogs.com/zxhl/p/7295699.html

LiberOJ #6210. 「美团 CodeM 决赛」tree 树形DP相关推荐

  1. LOJ#6085. 「美团 CodeM 资格赛」优惠券(set)

    题意 题目链接 Sol 考虑不合法的情况只有两种: 进去了 再次进去 没进去 但是出来了 显然可以用未知记录抵消掉 直接开个set维护一下所有未知记录的位置 最优策略一定是最后一次操作位置的后继 同时 ...

  2. 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp

    题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...

  3. loj 6083.「美团 CodeM 资格赛」数码

    题目: 给定两个整数\(l\)和\(r\),对于任意\(x\),满足\(l\leq x\leq r\),把\(x\)所有约数写下来. 对于每个写下来的数,只保留最高位的那个数码.求\([1,9]\)中 ...

  4. 「美团 CodeM 复赛」城市网络

    题目链接 题意分析 首先 \([u,v]\)在树上是一条深度递增的链 那么我们可以使用倍增找 \(x\)的祖先当中深度最大的值大于\(x\)的点 然后维护一个\(pre\) 重新建树 这样从\(x\) ...

  5. loj 6085.「美团 CodeM 资格赛」优惠券

    题目: 一个有门禁的大楼,初始时里面没有人. 现在有一些人在进出大楼,每个人都有一个唯一的编号.现在有他们进出大楼的记录,但是有些被污染了,只能知道这里有一条记录,具体并不能知道. 一个人只有进大楼, ...

  6. #6164. 「美团 CodeM 初赛 Round A」数列互质-莫队

    #6164. 「美团 CodeM 初赛 Round A」数列互质 思路 : 对这个题来言,莫队可以 n*根号n 离线处理出各个数出现个的次数 ,同时可以得到每个次数出现的次数 , 但是还要处理有多少 ...

  7. LibreOJ #6177. 「美团 CodeM 初赛 Round B」送外卖2【状压DP】

    「美团 CodeM 初赛 Round B」送外卖2 内存限制:32 MiB 时间限制:200 ms 题目描述 一 张 n 个 点 m 条 有 向 边 的 图 上 , 有 q 个 配 送 需 求 , 需 ...

  8. liberOJ#6006. 「网络流 24 题」试题库 网络流, 输出方案

    #6006. 「网络流 24 题」试题库   题目描述 假设一个试题库中有 n nn 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 m mm 道题组成试卷.并要求试卷 ...

  9. 2021牛客多校4 - Rebuild Tree(树形dp)

    题目链接:点击查看 题目大意:给出一棵 nnn 个节点的树,现在可以删掉 kkk 条边,然后加上 kkk 条边,问有多少种方案使得操作后 nnn 个点仍然是一棵树 题目分析:原树删掉 kkk 条边后会 ...

最新文章

  1. MIS开发中C/S模式与B/S模式的结合策略
  2. python编程难吗-都说python很简单 真的很好学么?
  3. 微信小程序的线程架构
  4. java 补充日期_Java 9对可选的补充
  5. android输入自动补全,Android用户输入自动提示控件AutoCompleteTextView使用方法
  6. liunx 常用操作
  7. Managing the Activity Lifecycle
  8. du,df命令和磁盘管理
  9. mysqld restart service 卡_MySQL数据库之mysqld服务启动失败, Failed to restart mysqld.service: Unit not found....
  10. 一段仿真PE加载器行为的程序
  11. Excel如何快速插入行,删除行
  12. memcached的安装
  13. cobaltstrike使用和巨龙拉冬9.0
  14. Playing with ptrace原文
  15. 【Ubuntu】SMBus Host controller not enabled(虚拟机进入不了图形界面)
  16. 二叉树遍历(递归、非递归)
  17. katex常用公式符号一览表
  18. Python练手小项目(11)用户名密码验证的初步探索
  19. [原]【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo
  20. 魔兽世界-战士的真谛

热门文章

  1. Nagios监控之9:利用sendmail使用第三方SMTP服务发送邮件报警
  2. JAVA程序员面试32问(答案)
  3. Bit-Scalable Deep Hashing with Regularized Similarity Learning for Image Retrieval and Person Re-ide
  4. 算法导论之平摊分析(动态表)
  5. Linux 关于动态链接库以及静态链接库的一些概念
  6. rockemq 发送延迟消息_RockeMQ通过代码监控消费者状态
  7. wordpress漏洞_多个WordPress插件SQL注入漏洞分析
  8. 欧蓝德 (660) -(警车内被乔丹体育)_几款豪华SUV的油耗与空间的巅峰对决!欧蓝德还是奇骏...
  9. AOP原理-AnnotationAwareAspectJAutoProxyCreator执行时机 || InstantiationAwareBeanPostProcessor
  10. RenderingHints 参数