UVA 10410 Tree Reconstruction
题意:
给定一个树的BFS和DFS,求这棵树。
分析:
拿dfs的序列,分成若干段,每一段相当一个子树,这样就可以利用bfs的序列去将dfs的序列分段,然后利用一个队列去存放每一段,不断求出子树即可。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int maxn=1010;
vector<int>g[maxn];
int pos[maxn],dfs[maxn],n;
int main()
{
while(~scanf("%d",&n))
{
memset(pos,0,sizeof(pos));
memset(dfs,0,sizeof(dfs));
int k,p,q=0;
int i;
for(i=0;i<n;++i)
scanf("%d",&k),pos[k]=i,g[i].clear();
scanf("%d",&dfs[0]);
for(i=1;i<n;i++)
{
scanf("%d",&p);
//cout<<q<<endl;
while(q&&pos[p]<=pos[dfs[q]]+1)
--q;
//cout<<q<<endl;
g[dfs[q]-1].push_back(p);
dfs[++q]=p;
}
for(i=0;i<n;i++)
{
printf("%d:",i+1);
for(int j=0;j<g[i].size();++j)
printf(" %d",g[i][j]);
printf("\n");
}
}
}