uva10410(dbl)

来源:互联网 发布:打开文件软件下载 编辑:程序博客网 时间:2024/06/08 06:27

给出BFS和DFS求树

#include<iostream>#include<cstdio>#include<cstring>#include<vector>using namespace std;const int maxn=1010;int n;vector<int> ans[maxn],sub[maxn],pos[maxn];int bfs[maxn],dfs[maxn];void init(){    for(int i=0;i<=n;i++)    {        sub[i].clear();        ans[i].clear();        pos[i].clear();    }}void process(int u,int s){    int rej=-1,j;    bool f=true;    for(int i=s;i<n;i++)    {        bool have=false;        for(j=0;j<sub[u].size();j++)            if(bfs[i]==sub[u][j])            {                 have=true;                 break;            }        if(have&&j>rej)        {            f=false;            rej=j;            ans[u].push_back(bfs[i]);            pos[u].push_back(j);        }        else if(!f)break;    }    for(int i=0;i<pos[u].size();i++)    {        int tmp=(i==pos[u].size()-1)?sub[u].size():pos[u][i+1];        for(int j=pos[u][i]+1;j<tmp;j++)            sub[ans[u][i]].push_back(sub[u][j]);        process(ans[u][i],s+pos[u].size());    }}void solve(){    for(int i=1;i<n;i++)        sub[bfs[0]].push_back(dfs[i]);    process(bfs[0],1);    for(int i=1;i<=n;i++)    {        printf("%d:",i);        for(int j=0;j<ans[i].size();j++)printf(" %d",ans[i][j]);        printf("\n");    }}int main(){    #ifndef ONLINE_JUDGE        freopen("in.txt","r",stdin);    #endif    while(scanf("%d",&n)!=EOF)    {        init();        for(int i=0;i<n;i++)cin>>bfs[i];        for(int i=0;i<n;i++)cin>>dfs[i];        solve();    }    return 0;}


0 0