UVA548 树 Tree
鬼畜读入。。。
如果多条路径和相同的话,输出叶子结点上值较小的一个。
const int N=10010;
string inorder,postorder;
int in[N],post[N];
int pos[N];
int n;
int minsum;
int ans;
void build(int inl,int postl,int n,int sum)
{
if(!n) return;
if(n == 1)
{
if(sum + in[inl] < minsum)
{
minsum=sum+in[inl];
ans=in[inl];
}
return;
}
int root=post[postl+n-1];
int k=pos[root];
int len=k-inl;
build(inl,postl,len,sum+root);
build(k+1,postl+len,n-1-len,sum+root);
}
int main()
{
while(getline(cin,inorder))
{
getline(cin,postorder);
stringstream ss(inorder);
n=0;
int x;
while(ss>>x)
in[n++]=x;
ss.clear();
ss.str(postorder);
n=0;
while(ss>>x)
post[n++]=x;
for(int i=0;i<n;i++) pos[in[i]]=i;
minsum=INF;
build(0,0,n,0);
cout<<ans<<endl;
}
//system("pause");
return 0;
}