您的位置:首页 > 理论基础 > 数据结构算法

【暑假】[基本数据结构]根据BFS与DFS确定树

2015-08-04 16:54 387 查看
UVa10410 Tree Reconstruction

算法:根据BFS构造pos数组以区分关系,在此基础上对DFS序列操作。注:栈中存父结点,栈顶是最优先的父结点。

代码如下:

#include<cstdio>
#include<vector>
#include<stack>
#define FOR(a,b,c) for(int a=(b);a<(c);a++)
using namespace std;

const int maxn= 1000 + 10;

int pos[maxn];      //BFS中的位置关系
vector<int> G[maxn];

int main(){
int n;
while(scanf("%d",&n)==1){
int x;
FOR(i,1,n+1){
scanf("%d",&x);
pos[x]=i;
G[i].clear();     //G_clear
}
int root;
scanf("%d",&root);
stack<int> sta; sta.push(root);
int v;
FOR(i,1,n){
scanf("%d",&v);
for(;;){
int u=sta.top();
if(u==root || pos[u]+1<pos[v]){  //u是v的父结点
sta.push(v);
G[u].push_back(v);
break;            //直到找到父结点
}
else  //u和v是兄弟 返回到u的父结点
sta.pop();
}
}
FOR(u,1,n+1){
printf("%d:",u);
FOR(j,0,G[u].size()) printf(" %d",G[u][j]);
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: