UVA 10410 Tree Reconstruction

来源:互联网 发布:艾美特 暖风机知乎 编辑:程序博客网 时间:2024/05/21 17:05
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <queue>#include <vector>using namespace std;const int size=1010;int n,ord[size],dfs[size],bfs[size],deep[size],vis[size];vector <int> arr[size];queue <int> q;int check(int a,int b,int curDeep){int i,e=dfs[a],f=dfs[b],c=ord[e],d=ord[f];for(i=a+1;i<b;i++){int tmp=dfs[i];if(deep[tmp]==0)continue;if(deep[tmp]!=curDeep)return 0;}for(i=c+1;i<d;i++){int tmp=bfs[i];if(!vis[tmp])return 0;}return 1;}void cal(int cur,int curDeep){int cnt=dfs[cur],i;for(i=cur+1;i<n;i++){int tmp=dfs[i];if(vis[tmp])continue;if(check(cur, i, curDeep+1))arr[cnt].push_back(tmp);elsecontinue;q.push(i);vis[tmp]=1;deep[tmp]=curDeep+1;}}void print(){int i,j;for(i=1;i<=n;i++){printf("%d:",i);for(j=0;j<arr[i].size();j++)printf(" %d",arr[i][j]);puts("");}}int main(){int i,j;while(scanf("%d",&n)!=EOF){memset(vis,0,sizeof(vis));memset(deep,0,sizeof(deep));memset(ord,0,sizeof(ord));memset(dfs,0,sizeof(dfs));memset(bfs,0,sizeof(bfs));for(i=0;i<=n;i++)arr[i].clear();while(!q.empty())q.pop();for(i=0;i<n;i++){int t;scanf("%d",&t);bfs[i]=t;ord[t]=i;}for(i=0;i<n;i++)scanf("%d",&dfs[i]);deep[dfs[0]]=1;q.push(0);while(!q.empty()){int cnt=q.front();q.pop();cal(cnt,deep[dfs[cnt]]);}print();}return 0;}

1 0
原创粉丝点击