用bfs和dfs建树--uva10410 Tree reconstruction

来源:互联网 发布:淘宝不能提交订单了 编辑:程序博客网 时间:2024/06/16 19:09

将bfs作为点的顺序。


#include <iostream>

#include <vector>

#include <cstdio>

using namespacestd;

const int maxn =1000 + 5;

int pos[maxn],dfs[maxn];

vector<int> mp[maxn];


int main()

{

    int n;

    while(scanf("%d",&n) !=EOF)

    {

        int k;

        for (int i =0; i < n; i ++) {

            scanf("%d",&k);

            pos[k] = i;

            mp[i].clear();

        }

        scanf("%d",&dfs[0]);

        int cnt =0,p;

        for (int i =1; i < n; i ++) {

            scanf("%d",&p);

            while (cnt &&pos[p] <= pos[dfs[cnt]] +1) {

//如果dfs[cnt]这个结点+1bfs中的顺序比下一个结点p大,说明他们是兄弟关系,需要cnt--,在dfs中前移找他的根节点

                cnt --;

            }

            mp[dfs[cnt] -1].push_back(p);

            dfs[++cnt] = p;

        }

        for (int i =0; i < n; i ++) {

            printf("%d:",i +1);

            for (int j =0; j < mp[i].size(); j ++) {

                printf(" %d",mp[i][j]);

            }

            printf("\n");

        }

    }

    return0;

}