HihoCoder1041 国庆出游 树形DP第四题
小Hi和小Ho准备国庆期间去A国旅游。A国的城际交通比较有特色:它共有n座城市(编号1-n);城市之间恰好有n-1条公路相连,形成一个树形公路网。小Hi计划从A国首都(1号城市)出发,自驾遍历所有城市,并且经过每一条公路恰好两次——来回各一次——这样公路两旁的景色都不会错过。
令小Hi苦恼的是他的小伙伴小Ho希望能以某种特定的顺序游历其中m个城市。例如按3-2-5的顺序游历这3座城市。(具体来讲是要求:第一次到达3号城市比第一次到达2号城市早,并且第一次到达2号城市比第一次到达5号城市早)。
小Hi想知道是否有一种自驾顺序满足小Ho的要求。
Input
输入第一行是一个整数T(1<=T<=20),代表测试数据的数量。
每组数据第一行是一个整数n(1 <= n <= 100),代表城市数目。
之后n-1行每行两个整数a和b (1 <= a, b <= n),表示ab之间有公路相连。
之后一行包含一个整数m (1 <= m <= n)
最后一行包含m个整数,表示小Ho希望的游历顺序。
Output
YES或者NO,表示是否有一种自驾顺序满足小Ho的要求。
Sample Input
2
7
1 2
1 3
2 4
2 5
3 6
3 7
3
3 7 2
7
1 2
1 3
2 4
2 5
3 6
3 7
3
3 2 7
Sample Output
YES
NO
实际也算不上是DP,感觉就是搜索。自己的思路,1A,开心。
思路:你如果访问了一个节点node,你必须也把子树中需要访问的给访问了,不然你的fa_node到node这条路将走超过两遍。
要求:node的几个子树中需要访问的点肯定要在顺序的相连位置。
其中:sa是每个点的顺序,son[node]表示node根下需要访问的点的顺序
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<memory>
#include<cstring>
using namespace std;
int sa[],son[][];//sa是每个点的顺序,son[node]表示node根下需要访问的点的顺序
int Laxt[],Next[],To[],cnt,vis[]; void _add(int u,int v)//加边
{
Next[++cnt]=Laxt[u];
Laxt[u]=cnt;
To[cnt]=v;
} bool _check(int u)//检查不包括u节点的u的子树中需要访问的点的顺序是否连续
{
sort(son[u]+,son[u]++son[u][]);//排序后方便检查
for(int i=;i<=son[u][];i++)
if(son[u][i]!=son[u][i-]+) return false;
return true;
} bool _dfs(int u)
{
vis[u]=;
for(int i=Laxt[u];i;i=Next[i]){
int v=To[i];
if(vis[v]) continue;
if(!_dfs(v)) return false;
for(int j=;j<=son[v][];j++) son[u][++son[u][]]=son[v][j];//加子树
}
if(!_check(u))return false;//检查子树
if(sa[u]&&son[u][]>&&sa[u]+!=son[u][]) return false;//根是不是第一个
if(sa[u]) son[u][++son[u][]]=sa[u];//加根
return true;
} int main()
{
int T,i,j,n,m,u,v;
scanf("%d",&T); while(T--){
memset(sa,,sizeof(sa));
memset(Laxt,,sizeof(Laxt));
memset(son,,sizeof(son));
memset(vis,,sizeof(vis));
cnt=; scanf("%d",&n);
for(i=;i<n;i++) {
scanf("%d%d",&u,&v);
_add(u,v);_add(v,u);
} scanf("%d",&m);
for(i=;i<=m;i++){
scanf("%d",&j);sa[j]=i;
} if(_dfs()) printf("YES\n");
else printf("NO\n"); }
return ;
}
HihoCoder1041 国庆出游 树形DP第四题的更多相关文章
- 【DP_树形DP专题】题单总结
转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...
- CF482D Random Function and Tree 树形DP + 思维 + 神题
Code: #include<bits/stdc++.h> #define ull unsigned long long #define MOD 1000000007 #define ll ...
- HDU-4126 Genghis Khan the Conqueror 树形DP+MST (好题)
题意:给出一个n个点m条边的无向边,q次询问每次询问把一条边权值增大后问新的MST是多少,输出Sum(MST)/q. 解法:一开始想的是破圈法,后来想了想应该不行,破圈法应该只能用于加边的情况而不是修 ...
- HDU4035 Maze 期望DP+树形DP(好题)
题意:有一个树形的迷宫,有N个房间(标号为1~N)以及N-1条通道将它们连通,一开始在1号房间,每进入一个房间i,有k[i]的概率被陷阱杀死回到房间1,有s[i]的概率找到出口逃离迷宫,如果没有找到出 ...
- HihoCoder1050 树中的最长路 树形DP第三题(找不到对象)
题意:求出的树中距离最远的两个结点之间相隔的距离. 水题一道,以前只会用路的直径来解. 代码如下: #include<cstdio> #include<cstdlib> #in ...
- POJ 1849 Two(树的直径--树形DP)(好题)
大致题意:在某个点派出两个点去遍历全部的边,花费为边的权值,求最少的花费 思路:这题关键好在这个模型和最长路模型之间的转换.能够转换得到,全部边遍历了两遍的总花费减去最长路的花费就是本题的答案,要思考 ...
- 树形DP(简单题)(Y HDU4705)
题意:给出一个n个节点的树形图,统计{A,B,C}的数量,其中ABC分别是树上三个不同的节点,并且这三个节点不能被一条路径覆盖 分析:对于下图 进行dfs深搜统计,num[u]统计回溯到当前节点u,并 ...
- 树形dp入门两题
题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...
- HDU 2196 Computer 树形DP 经典题
给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...
随机推荐
- APPIUM API整理(python)---元素查找
最近在学习自动化框架appium,网上找一些API相关资料整理了一下 1.find_element_by_id find_element_by_id(self, id_): Finds element ...
- orecle 函数
--创建函数语法 create [or replace] function [schema.]function_name (函数参数列表) --参数有IN.OUT.IN OUT三种类型:IN代表需要输 ...
- MYSQL的基本语句——思维导图
如图 思维导图图片链接 http://www.edrawsoft.cn/viewer/public/s/a1718332616630 有道云笔记图片链接 http://note.youdao.com/ ...
- C++转C#函数事例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...
- Red Hat OpenStack 10的新特性
这是Red Hat有史以来最好的版本,同时也是第一个长生命周期版本(最长五年支持),这篇文章会介绍为什么这是你私有云最好的礼物. 由于要使用命令行,以前安装OpenStack是很繁重的工作.这个版本提 ...
- css文本(教程)
1.text-transform --文本转换 定义文本的大小写状态,此属性对中文无意义 取值:capitalize | uppercase | lowercase | none | inherit ...
- .NET、C#和ASP.NET三者之间的区别与联系
.NET.C#和ASP.NET三者之间的区别与联系 1..net(dot net) .net是一个平台,抽象的平台概念. 实现形式是库:①定义了基本的类型(通用类型系统CTS,common type ...
- GO学习笔记:函数defer
Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句.当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回.特别是当你在进行一些打开资源的操作时,遇 ...
- linux下如何上传和下载文件
一. 安装工具包rz及sz lrzsz是一个unix通信套件提供的X,Y,和ZModem文件传输协议,可以用在windows与linux 系统之间的文件传输,体积小速度快 yum install -y ...
- 微信公众号 iOS UITextFiled 用中文键盘输英文出现空格的解决方法
问题出现的现象: 最近公司开发微信公众号邀请码,需要对用户输入进行限制,允许输入的是字母和数字,其他输入会使用正则表达式禁止.但是有iOS用户反映在输入字母过程中,经常几个字母之后,邀请码不对,查看公 ...