#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; }
uva 548
猜你喜欢
转载自blog.csdn.net/a874288174/article/details/79833548
今日推荐
周排行