这一题不是自己想出来的思路,看了一眼解题报告。

题意是这样的,求给定的一棵树中是否存在一条长度为L的路径,注意这个值可能为负数,这也是简洁版的解题报告的最后一句忠告。这题有一个非常好的特性,那就是所有的边的长度要么为1,要么为2,也就是说我们所求得的路径是由若干个1,2组成的。那么也就有了下面的结论:当我们得到一条长度为S的路径时,现在考虑到构成路径S的左右两端的两条边,这两条边的组合情况是(1, 1), (1, 2), (2, 2)那么注意到我们始终可以去掉长度为2的一段,因此有结论:若整个树中最长的偶数边为EM,最长的奇数边为OM,由于任何一个询问不是奇数就是偶数,那么如果这个数是偶数的话,则判定其是否小于我们计算出来的EM,同理,奇数的话,则判定是否小于OM即可。

求解的过程就是从任意一个点开始进行dfs,并且对于每一条边保留两个值,表示从这个顶点的这一条边向下能够得到的偶数和奇数路径的最大长度,再结合其孩子的情况加之边的奇偶进行动态规划。

代码如下:

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;struct Node {int x, fee, next;int path[2]; // 记录该条路径下的奇偶最长路径
}e[200010];int head[100005], N, Q, idx, OM, EM;
bool vis[200010];void insert(int a, int b, int c) {++idx;e[idx].x = b, e[idx].fee = c;e[idx].path[0] = e[idx].path[1] = 0;e[idx].next = head[a];head[a] = idx;
}void update(int x) {for (int i = head[x]; i != -1; i = e[i].next) {if (vis[i]) {continue;    }vis[i] = 1;update(e[i].x);int oM = 0, eM = 0;for (int j = head[e[i].x]; j != -1; j = e[j].next) {if (e[j].x == x) continue;  // 该条线路已被占用,否则形成了往返的线路 eM = max(eM, e[j].path[0]); // 子节点除本身路径之外其他路径的偶最长路oM = max(oM, e[j].path[1]);}if (e[i].fee == 1) {  // 如果这条路径为奇数 if (oM != 0) {e[i].path[0] = oM + 1;}e[i].path[1] = eM + 1;} else {e[i].path[0] = eM + 2;if (oM != 0) {e[i].path[1] = oM + 2;}}EM = max(EM, e[i].path[0]);OM = max(OM, e[i].path[1]);}
}int main() {while (scanf("%d %d", &N, &Q) == 2) {OM = EM = 0;memset(head, 0xff, sizeof (head));memset(vis, false, sizeof (vis));int a, b, c;idx = -1;for (int i = 1; i < N; ++i) {scanf("%d %d %d", &a, &b, &c);insert(a, b, c);insert(b, a, c);} update(1);int x;for (int i = 0; i < Q; ++i) {scanf("%d", &x);if (x < 0) {puts("No");    continue;}if (x & 1) {puts(x <= OM ? "Yes" : "No");    } else {puts(x <= EM ? "Yes" : "No");    }}}return 0;
}

Acdream Path 动态规划相关推荐

  1. 明翰数据结构与算法笔记V0.8(持续更新)

    文章目录 前言 数据结构 `线性表` `数组` `链表` `栈与队列` [串/字符串] 树 并查集 `二叉树` [二叉排序树/二叉搜索树] `红黑树` 红黑树操作 霍夫曼树 `堆` [大/小]根堆 可 ...

  2. 杭电oj题目题型分类(转)

    1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...

  3. HDOJ题目分类大全

    版权声明:本文为博主原创文章,欢迎转载,转载请注明本文链接! https://blog.csdn.net/qq_38238041/article/details/78178043 杭电里面有很多题目, ...

  4. HDU题目分类大全【大集合】

    基础题: 1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029.  1032.1037.1040.1048.1056.105 ...

  5. 杭电OJ题目分类(转载)

    1001 整数求和 水题 1002 C语言实验题--两个数比较 水题 1003 1.2.3.4.5... 简单题 1004 渊子赛马 排序+贪心的方法归并 1005 Hero In Maze 广度搜索 ...

  6. hdoj杭电问题分类

    杭电上的题虽然多,但是一直苦于找不到问题分类,网页都是英文的,所以平时做题也没怎么看,今天仔细一看,问题分类竟然就在主页....做了那么久的题居然没发现,表示已经狗带..不要笑,不知道有没有像我一样傻 ...

  7. 转载:Hdu 题目分类

    原址点击 基础题:1000.1001.1004.1005.1008.1012.1013.1014.1017.1019.1021.1028.1029. 1032.1037.1040.1048.1056. ...

  8. HD OJ 题目分类

    动态规划:2037 2054 2084 hdu题目分类(转) http://blog.csdn.net/vsooda/article/details/7258791 1001 整数求和 水题 1002 ...

  9. hdu与poj题目分类

    POJ 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(po ...

最新文章

  1. Linux下查找、删除、替换命令
  2. PL/SQL Developer 9 注册机
  3. 雨林木风win11 64位原版系统v2021.08
  4. C#LeetCode刷题-Map
  5. android键盘覆盖edittext_“新”意满满 :联想小新Pad Pro搭载磁吸键盘及支架套装初体验...
  6. allure 测试报告本地打开_Pytest和Allure测试框架(二)
  7. python海贼王logo_Python入门之生成海贼王云图
  8. 【QT】QT从零入门教程(八):图像灰度化
  9. 【等保小知识】等保二级是否需要做密评?什么是密评?
  10. 如何通过Homography矩阵制作虚拟图像
  11. html制作网页案例代码----(故宫博物馆9页)特效很多
  12. 金彩教育:如何提升自然流量
  13. 星际争霸2神族全兵种介绍
  14. pdf编辑器免安装版_墙裂推荐!功能强大的PDF编辑器最新免安装版!
  15. Android自定义View2--触摸事件传递机制
  16. java论文答辩老师会问什么,毕业论文答辩老师一般会问什么问题
  17. iphone ios 视频采集AVCaptureSessionPresetHigh/Medium/Low分辨率等参数
  18. 国庆第三天的一些杂感
  19. 刷爆朋友圈的虚幻引擎5,会给我们带来哪些影响?
  20. Snell法则的推导

热门文章

  1. 用PIL读取保存图片错误 :OSError: cannot write mode RGBA as JPEG
  2. 在Ubuntu下输入ifconfig命令返回: ifconfig:找不到命令
  3. Spring源码编译及过程中的一些问题总结
  4. Poj 2195 Going Home
  5. 前序,中序,后序遍历
  6. insert数据时,获取插入数据的id
  7. 从XML文件乱码问题,探寻其背后的原理
  8. java runnable wait_面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?...
  9. httpClient3.1 笔记
  10. centos mysql密码设置密码_CentOS下设置MySQL的root密码