首页 > 代码库 > UVA 10410 - Tree Reconstruction(树)

UVA 10410 - Tree Reconstruction(树)

UVA 10410 - Tree Reconstruction

题目链接

题意:给定一个树的dfs序列和bfs序列,求出这颗树

思路:拿dfs的序列,分成若干段,每一段相当一个子树,这样就可以利用bfs的序列去将dfs的序列分段,然后利用一个队列去存放每一段,不断求出子树即可。一开始以为parse tree一定是二叉树,原来不一定啊。

代码:

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

const int N = 1005;

int n, b[N], d[N], now;
vector<int> g[N];

struct Seg {
    int l, r;
    Seg(){}
    Seg(int l, int r) {
	this->l = l;
	this->r = r;
    }
};

void bfs() {
    now = 1;
    queue<Seg> Q;
    Q.push(Seg(0, n));
    while (!Q.empty()) {
	Seg p = Q.front();
	Q.pop();
	int u = d[p.l];
	if (now == n || p.l + 1 == p.r) continue;
	int pre = p.l + 1;
	g[u].push_back(d[pre]);
	now++;
	for (int i = p.l + 2; i < p.r; i++) {
	    if (b[now] == d[i]) {
		g[u].push_back(d[i]);
		Q.push(Seg(pre, i));
		pre = i;
		now++;
	    }
	}
	if (pre < p.r)
	    Q.push(Seg(pre, p.r));
    }
}

int main() {
    while (~scanf("%d", &n)) {
	for (int i = 0; i < n; i++) {
	    g[i + 1].clear();
	    scanf("%d", &b[i]);
	}
	for (int i = 0; i < n; i++)
	    scanf("%d", &d[i]);
	bfs();
	for (int i = 1; i <= n; i++) {
	    printf("%d:", i);
	    for (int j = 0; j < g[i].size(); j++)
		printf(" %d", g[i][j]);
	    printf("\n");
	}
    }
    return 0;
}


UVA 10410 - Tree Reconstruction(树)