uva548

来源:互联网 发布:贵州大数据发展管理局 编辑:程序博客网 时间:2024/05/14 22:20

思路:题目的意思是找一条从根节点到叶子节点的路径,从所有路径中找一条路径节点和最小的路径,并输出该路径的最后一个节点的值;

模拟二叉树还原,记录前面的值,到达叶子节点的时候比较下就好了。

点击题目链接

/*****************************************Author      :Crazy_AC(JamesQi)Time        :2015File Name   :*****************************************/// #pragma comment(linker, "/STACK:1024000000,1024000000")#include <iostream>#include <algorithm>#include <iomanip>#include <sstream>#include <string>#include <stack>#include <queue>#include <deque>#include <vector>#include <map>#include <set>#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <limits.h>using namespace std;#define MEM(a,b) memset(a,b,sizeof a)typedef long long LL;typedef unsigned long long ULL;typedef pair<int,int> ii;const int inf = 1 << 30;const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;inline int Readint(){char c = getchar();while(!isdigit(c)) c = getchar();int x = 0;while(isdigit(c)){x = x * 10 + c - '0';c = getchar();}return x;}int in[10010],post[10010];string s1,s2;int top;int MIN;int pos;void solve(int l,int r,int sum){int mid;for (int i = l;i <= r;i++)if (in[i] == post[top]){mid = i;break;}if (mid < r){top--;solve(mid + 1,r,sum + in[mid]);}if (mid > l){top--;solve(l,mid - 1,sum + in[mid]);}if (l == r){if (MIN > in[mid] + sum){pos = in[mid];MIN = in[mid] + sum;}return ;}}int main(){// freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);while(getline(cin,s1)){getline(cin,s2);stringstream AA(s1);stringstream BB(s2);int in_top = 0,post_top = 0;int buf;while(AA >> buf){in[in_top++] = buf;}while(BB >> buf){post[post_top++] = buf;}in_top--;post_top--;top = in_top;MIN = INF;solve(0,in_top,0);printf("%d\n",pos);}return 0;}


0 0
原创粉丝点击