uva 10410 树重建

来源:互联网 发布:生产成本管控数据来源 编辑:程序博客网 时间:2024/06/06 00:58

题目大意:给定一个树的BFS和DFS,求这棵树。

解题思路:用栈维护即可。对应BFS序列映射出了每个节点和根节点的距离,遍历dfs序列,对当前节点和栈顶节点比较,如果该节点距离根节点更远,则说明该节点为栈顶节点个孩子节点,则记录后将节点放入栈中。否则弹掉栈顶元素继续比较。需要注意一点,即当元素与栈顶元素的距离值大1的时候要视为相等,因为它们属于兄弟节点

//  Created by Chenhongwei in 2015.//  Copyright (c) 2015 Chenhongwei. All rights reserved.#include"iostream"#include"cstdio"#include"cstdlib"#include"cstring"#include"climits"#include"queue"#include"cmath"#include"map"#include"set"#include"stack"#include"vector"#include"sstream"#include"algorithm"using namespace std;typedef long long ll;int p[1010],n;vector<int>c[1010];int main(){//ios::sync_with_stdio(false);// freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);while(cin>>n&&n){int tmp;for(int i=1;i<=n;i++){cin>>tmp;p[tmp]=i;}int root;cin>>root;stack<int>q;q.push(root);for(int i=1;i<n;i++){cin>>tmp;while(1){int t=q.top();if(t==root||p[t]+1<p[tmp]){c[t].push_back(tmp);q.push(tmp);break;}else q.pop();}}for(int i=1;i<=n;i++){cout<<i<<':';for(int j=0;j<c[i].size();j++)cout<<' '<<c[i][j];cout<<endl;c[i].clear();}}return 0;}


0 0