uva 548

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<vector>
#include<sstream>
using namespace std;

const int maxn = 10000 + 10;
int in_order[maxn], post_order[maxn];
vector<vector<int> >v;

int read_list(int *a){
    string line;
    if(!getline(cin,line)) return 0;
    stringstream ss(line);
    int n = 0;
    int x;
    while(ss >> x) a[n++] = x;
    return n;
}

int f(int inl, int inr, int post){
    if(inl > inr) return -1;
    int i = inl, k = post_order[post];
    while(in_order[i] != k) i++;
    int left = f(inl,i-1,post+i-inr-1); if(left != -1)  v[k].push_back(left);
    int right = f(i+1,inr,post-1);      if(right != -1) v[k].push_back(right);
    return k;
}

int ans, sum, tempsum, leaf;
void dfs(int i){
   if(v[i].size() == 0){
       if(tempsum < sum || (tempsum == sum && i < leaf)){
            sum = tempsum; leaf = i;
            return ;
       }
   }
   for(int j = 0; j < v[i].size(); j++){
       tempsum += v[i][j];
       dfs(v[i][j]);
       tempsum -= v[i][j];
   }
}

int main(){
    while(read_list(in_order)){
        int n = read_list(post_order);
        v.clear();
        v.resize(maxn);
        int root = f(0,n-1,n-1);
        ans = -1, sum = 999999, tempsum = root, leaf = 999999;
        dfs(root);
        cout<<leaf<<endl;
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/a874288174/article/details/79833548