题意,给你一颗树的bfs序和dfs序,结点编号小的优先历遍,问你可能的一种树形;

输出每个结点的子结点。

注意到以下事实:

(1)dfs序中一个结点的子树结点一定是连续的。

(2)bfs,dfs序中的一个结点u的后续结点一定是u或u的后兄弟结点{v},或u和{v}的后代节点{s}。

(3)如果有后兄弟结点,那么bfs序中u后面紧跟着的一定是第一后兄弟结点v1,

(4)如果有后代结点,那么dfs序中u后面紧跟着的一定是第一个子结点s1。

记结点u的bfs序记为bfs(u),dfs序记为dfs(v);

dfs序中,一个结点u,结点为v满足dfs(v) = dfs(u) + 1,如果bfs(v) = bfs(u)+1 且 v > u;那么v一定可以视作u的第一个后兄弟结点,

如果不成立,那么v是u的子节点,可以推出u是bfs中u所在层的最后一个结点,这时候u没有后兄弟结点,所以后面的结点一定都是他的后代结点,那么v就一定可以等效作u的兄弟结点而不改变bfs,dfs序。

到此,(5)满足bfs(v) = bfs(u)+1 且 v > u条件的v看作是u的第一个后兄弟结点,不满足这个条件的一定不是后兄弟结点,这个可以根据定义可证。

如果v满足(5),根据(1),u以及子树就访问完了,如果v不满足条件且bfs(v)>bfs(u) + 1那么v一定是u的子结点,如果bfs(v)<bfs(u)那么说明v是其父辈结点,而且u的子树已经访问完了。

迭代上述过程,用栈辅助完成,边界条件是root,大功告成~

学习点:

1.用栈处理递归过程。

2.bfs,dfs线性序列的性质。

原来树形转线性要用到这些性质

// Rey
#include<bits/stdc++.h>
using namespace std;
const int maxn = +; vector<int> G[maxn];
int pos[maxn]; int main()
{
// freopen("in.txt","r",stdin);
int n;
int t;
while(~scanf("%d",&n)&&n){
for(int i = ; i <= n; i++)
scanf("%d",&t), pos[t] = i, G[i].clear();
int root;
scanf("%d",&root);
stack<int> sta;
sta.push(root);
for(int i = ; i < n; i++){
scanf("%d",&t);
for(;;) {
int u = sta.top();if( pos[u]+ < pos[t] || (pos[u]+ == pos[t] && u > t) || u == root ) {
G[u].push_back(t);
sta.push(t);
break;
}else {
sta.pop();
}
} }
for(int i = ; i <= n; i++) {
printf("%d:",i);
for(int j = , sz = G[i].size(); j < sz; j++)
printf(" %d",G[i][j]);
puts("");
}
}
return ;
}

UVA10410 TreeReconstruction 树重建 (dfs,bfs序的一些性质,以及用栈处理递归 )的更多相关文章

  1. cf276E 两棵线段树分别维护dfs序和bfs序,好题回头再做

    搞了一晚上,错了,以后回头再来看 /* 对于每次更新,先处理其儿子方向,再处理其父亲方向 处理父亲方向时无法达到根,那么直接更新 如果能达到根,那么到兄弟链中去更新,使用bfs序 最后,查询结点v的结 ...

  2. UVA10410-Tree Reconstruction(BFS序和DFS序的性质)

    Problem UVA10410-Tree Reconstruction Accept:708  Submit:4330 Time Limit: 3000 mSec Problem Descripti ...

  3. CSU_1414 Query On a Tree BFS序+DFS时间戳进行预处理

    2014 csu校赛 I 题,比赛的时候拿着他看了几个小时愣是没弄出好的方法,我们也想过统计出每个root的节点总数,然后减去离它d层的子节点的数目,即为答案.但是因为树的存储是无序的,所以每次为了找 ...

  4. [2]树的DFS序

    定义: 树的DFS序就是在对树进行DFS的时候,对树的节点进行重新编号:DFS序有一个很强的性质: 一颗子树的所有节点在DFS序内是连续的一段, 利用这个性质我们可以解决很多问题. 代码: void ...

  5. HDU5957 Query on a graph(拓扑找环,BFS序,线段树更新,分类讨论)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5957 题意:D(u,v)是节点u和节点v之间的距离,S(u,v)是一系列满足D(u,x)<=k的点 ...

  6. 树的dfs序 && 系统栈 && c++ rope

    利用树的dfs序解决问题: 就是dfs的时候记录每个节点的进入时间和离开时间,这样一个完整的区间就是一颗完整的树,就转化成了区间维护的问题. 比如hdu3887 本质上是一个求子树和的问题 #incl ...

  7. CF877E Danil and a Part-time Job 线段树维护dfs序

    \(\color{#0066ff}{题目描述}\) 有一棵 n 个点的树,根结点为 1 号点,每个点的权值都是 1 或 0 共有 m 次操作,操作分为两种 get 询问一个点 x 的子树里有多少个 1 ...

  8. HDU4117 GRE WORDS(AC自动机+线段树维护fail树的dfs序)

    Recently George is preparing for the Graduate Record Examinations (GRE for short). Obviously the mos ...

  9. 【NOI2019集训题2】 序列 后缀树+splay+dfs序

    题目大意:给你一个长度为$n$的序列$a_i$,还有一个数字$m$,有$q$次询问 每次给出一个$d$和$k$,问你对所有的$a_i$都在模$m$意义下加了$d$后,第$k$小的后缀的起点编号. 数据 ...

随机推荐

  1. 关于 Number() parsint() abs() 的区别

    1. parseInt(‘’)      parseInt() 函数可解析一个字符串,并返回一个整数. 如果第一个字符不是数字或者负号,parseInt() 就会返回NaN 2.Number()    ...

  2. mysql由浅入深探究(二)----mysql用户操作

    上一节我们完成了mysql的安装,现在我们将开启实战模式,完成一些基本的mysql操作.这节我们分为一些几个内容: mysql中用户新建 mysql中用户删除 mysql中用户修改 mysql中用户查 ...

  3. 安装pywin32时,出现找不到python27注册信息的解决办法

    1. 检查一下注册表是否存在python其它版本的信息 方法: 1)在命令行中输入regedit打开注册表 2)在HKEY_CURRENT_USER\Software中找一下是否存在python注册信 ...

  4. gulp --watch直接退出,并没有监听

    1.在es6(彩票项目)搭建环境时遇到gulp --watch 只运行一次就退出了不能监听: D:\nodejs\es6-base>gulp --watch [::] Failed to loa ...

  5. 719D(树形dp)

    题目链接:http://codeforces.com/contest/791/problem/D 题意:给出一棵树,每两个点之间的距离为1,一步最多可以走距离 k,问要将任意两个点之间的路径都走一遍, ...

  6. 搭建Windows IIS(Internet Information Server)服务器

    1.找到 控制面板\程序 点击 “打开或关闭Windows功能” ,全部选上“Internet信息服务”,这里可能要等几分钟. 2.完成之后你打开C盘,在他的根目录下多出一个inetpub文件夹里面有 ...

  7. python 之 软件开发目录规范 、logging模块

    6.4 软件开发目录规范 软件(例如:ATM)目录应该包含: 文件名 存放 备注 bin start.py,用于起动程序   core src.py,程序核心功能代码   conf settings. ...

  8. 基于Vue的省市区三级联动插件

    官网地址:https://distpicker.uine.org/ 安装: npm install v-distpicker --save 局部注册: import VDistpicker from ...

  9. C# dynamic与var的区别

    1.C#编程总结(十四)dynamic 2.var和dynamic的区别及如何正确使用dynamic?

  10. 转 dos 下的 find 和 重定向 and 删除

    1.find /i "ora-" *.* > check.log del /Q .\log\*.* 附录: 我对findstr是如此的依赖,以至于当我向各位讲解find命令的 ...