题目链接:点击打开链接

题意:

给定n个节点的树

1为根

则此时叶子节点已经确定

最后一行给出叶子节点的顺序

目标:

遍历树并输出路径。要求遍历叶子节点时依照给定叶子节点的先后顺序訪问。

思路:

给每一个节点加一个优先级。

把最后一个叶子节点到父节点的路径上的点优先级改为1

把倒数第二个叶子节点到父节点的路径上的点优先级改为2

如此每一个点就有一个优先级,每一个訪问儿子节点时先訪问优先级大的就可以

对于无解的推断:得到的欧拉序列不满足输入的叶子节点顺序即是无解。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <math.h>
#include <set>
#include <vector>
#include <map>
using namespace std;
#define ll int
#define N 310
ll n;
vector<ll>G[N];
int fa[N], du[N];
void dfs(int u,int father){
fa[u] = father;
for(int i = 0; i < G[u].size(); i++) {
int v = G[u][i]; if(v==father)continue;
dfs(v,u);
}
}
int val[N], Stack[N<<1], top;
bool cmp(int a,int b) {
return val[a]>val[b];
}
void work(int u, int father) {
Stack[top++] = u;
vector<int>son;
son.clear();
for(int i = 0; i < G[u].size(); i++){
int v = G[u][i]; if(v==father)continue;
son.push_back(v);
}
sort(son.begin(), son.end(), cmp);
for(int i = 0; i < son.size(); i++) {
work(son[i], u);
Stack[top++] = u;
}
}
vector<int>input;
bool ok(){
int u = 0;
for(int i = 0; i < top; i++)
if(Stack[i]==input[u])
u++;
return u >= input.size();
}
int main(){
ll i,j,u,v;
while(cin>>n){
input.clear();
memset(du, 0, sizeof du);
for(i = 1; i <= n; i++)
G[i].clear();
for(i = 1; i < n; i++) {
scanf("%d %d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
du[u]++; du[v]++;
}
int leaf = 0;
for(i = 2; i <= n; i++)
if(du[i]==1)
leaf++;
dfs(1,-1);
for(i = leaf; i; i--) {
scanf("%d",&u);
input.push_back(u);
while(u!=-1){
val[u] = i;
u = fa[u];
}
}
top = 0;
work(1,-1);
if(ok()) {
<span style="white-space:pre"> </span>for(i = 0; i < top; i++)
printf("%d%c",Stack[i],i==top-1?'\n':' ');
}
else puts("-1");
}
return 0;
}

Codeforces 29D Ant on the Tree 树的遍历 dfs序的更多相关文章

  1. codeforces 29D Ant on the Tree (dfs,tree,最近公共祖先)

    D. Ant on the Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  2. POJ 3321 Apple Tree (树状数组+dfs序)

    题目链接:http://poj.org/problem?id=3321 给你n个点,n-1条边,1为根节点.给你m条操作,C操作是将x点变反(1变0,0变1),Q操作是询问x节点以及它子树的值之和.初 ...

  3. CodeForces 29D Ant on the Tree

    洛谷题目页面传送门 & CodeForces题目页面传送门 题意见洛谷里的翻译. 这题有\(\bm3\)种解法,但只有一种是正解(这不是废话嘛). 方法\(\bm1\):最近公共祖先LCA(正 ...

  4. E - Apple Tree(树状数组+DFS序)

    There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in the tree. ...

  5. BZOJ.2434.[NOI2011]阿狸的打字机(AC自动机 树状数组 DFS序)

    题目链接 首先不需要存储每个字符串,可以将所有输入的字符依次存进Trie树,对于每个'P',记录该串结束的位置在哪,以及当前节点对应的是第几个串(当前串即根节点到当前节点):对于'B',只需向上跳一个 ...

  6. 【BZOJ】2434: [Noi2011]阿狸的打字机 AC自动机+树状数组+DFS序

    [题意]阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小写 ...

  7. luogu SP8093 后缀自动机+树状数组+dfs序

    这题解法很多,简单说几个: 1. 线段树合并,时间复杂度是 $O(nlog^2n)$ 的. 2. 暴力跳 $fail,$ 时间复杂度 $O(n\sqrt n),$ 比较暴力. 3. 建立后缀树后在 $ ...

  8. Codeforces 375D Tree and Queries(DFS序+莫队+树状数组)

    题目链接  Tree and Queries 题目大意  给出一棵树和每个节点的颜色.每次询问$vj, kj$ 你需要回答在以$vj$为根的子树中满足条件的的颜色数目, 条件:具有该颜色的节点数量至少 ...

  9. HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)

    Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

随机推荐

  1. Linux上MySQL的安装

    a.检测是否安装了mysql rpm  -qa | grep mysql b.卸载系统自带的mysql rpm -e --nodeps 卸载的包 rpm -e --nodeps mysql-libs- ...

  2. 通过扩大IE使用内存,解决skyline在IE下模型不能加载的方法

    环境:skyline TerraExploere 6.6.1,win10 专业版 64位,ie 11 情况描述:在ie下浏览三维场景,ie占用内存不断增大并且内存占用固定在一个最高范围内,三维场景中部 ...

  3. js中的break,continue和return到底怎么用?

    为什么要说个?好像很简单,但是我也会迷糊,不懂有时候为什么要用return,然而break和continue也经常和他放在一起. 所以就一起来说一说,这三个看起来很简单,却常常会出错的关键词的具体用法 ...

  4. linux服务器上Apache配置多域名

    一, 打开httpd.conf 二 找到如下三个位置配置如下 DocumentRoot "/data" #以下这个配置是紧挨着的,有两个 <Directory "/ ...

  5. SpringMVC 视图解析器

    SpringMVC 视图解析器 还记得SpringMVC 快速入门中,dispatcher-servlet.xml 配置的视图解析器么.它是SpringMVC 的核心知识点.本章节比较简单,明白视图解 ...

  6. (五)solr7.1.0之solrJ的使用

    (五)solr7.1.0之solrJ的使用 下面是solr7的官网API介绍: 网页翻译的不是很准确,只能了解个大概,基本能获取如下信息: 一.构建和运行SolrJ应用程序 对于用Maven构建的项目 ...

  7. 【深度学习系列】用PaddlePaddle和Tensorflow进行图像分类

    上个月发布了四篇文章,主要讲了深度学习中的"hello world"----mnist图像识别,以及卷积神经网络的原理详解,包括基本原理.自己手写CNN和paddlepaddle的 ...

  8. 自己动手写Redis客户端(C#实现)4 - 整数回复

    整数回复 整数回复就是一个以 ":" 开头, CRLF 结尾的字符串表示的整数. 比如说, ":0\r\n" 和 ":1000\r\n" 都 ...

  9. 例题:填词-poj

    问题描述 Alex喜欢填词游戏.填词游戏是一个非常简单的游戏.填词游戏包括一个N X M大小的矩形方格盘和P个单词.玩家需要把每个方格中填上一个字母使得每个单词都能在方格盘上被找到.每个单词都能被找到 ...

  10. 虚拟机安装 deepin Linux 注意事项

    主要要注意下面几点: 一.虚拟机"客户机操作系统"类型 选择"Windows 7 x64" 选择"客户机操作系统"类型,这个选择十分重要,D ...