题目链接:点击打开链接

题意:

给定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分析日志的一些常用方法

    head -n 2016_05_23_access_log |grep "/859" 显示前10000行中包含 /859 的记录 增加 |wc -l  则改为输出记录数 cat 2 ...

  2. python添加自定义cookies

    import cookielib,urllib2 class AddCookieHandler(urllib2.BaseHandler): def __init__(self,cookieValue) ...

  3. JS获取DOM元素

    1.childNodes:获取节点,不同浏览器表现不同: IE:只获取元素节点: 非IE:获取元素节点与文本节点: 解决方案:if(childNode.nodeName=="#text&qu ...

  4. HttpClient发送Post请求,get请求

    // 创建默认的httpclient实例 CloseableHttpClient httpclient = getHttpClient(); CloseableHttpResponse respons ...

  5. Python的__main__.py用法

    [背景] 在看flower的时候看到__main__.py文件,不知道具体做什么用? 故先进行测试看看. [测试代码] 测试代码目录结构如下: . `-- test |-- __init__.py | ...

  6. FPGA FIFO深度计算

    转自:http://comm.chinaaet.com/adi/blogdetail/37555.html 首先,一定要理解清楚FIFO的应用场景,这个会直接关系到FIFO深度的计算,如果是面试官抛出 ...

  7. iOS打包静态库(完整篇)

    1. 什么是库? 所谓库就是程序代码的集合,是共享程序代码的一种方式. 2. 库的分类 根据程序代码的开源情况,库可以分为两类 开源库源代码是公开的,你可以看到具体实现.比如GitHub上比较出名的第 ...

  8. EXTtreeGrid分页

    这个东西整了两天,关键在于要两个stroe,之所以要两个因为treestroe在分页的时候接受不了返回的总行数,不过有个问题就是第二页分页后显示在没有根节点的行层级显示不是那木明显: -------- ...

  9. Python之int内部功能介绍

    int内部功能的介绍 type(): 1.基本数据类型使用type()函数时,得到相应的数据类型a = 12b = 12.01c = "123"print(type(a)) > ...

  10. Play-With-Docker在chrome上的插件

    一键使用PWD 在chrome扩展中,找到"Play With Docker"插件,并安装在chrome浏览器中 进入hub.docker.com网站,搜索熟悉的docker镜像. ...