UVa:548 Tree

2156 단어 데이터 구조
이 문 제 는 여러 번 무릎 을 꿇 었 는데 모두 문 제 를 잘못 읽 었 기 때문이다.
그것 은 어떤 경로 가 가장 작은 상황 에서 잎 결점 의 값 을 요구한다.만약 여러 개의 최소 경로 가 존재 한다 면, 가장 작은 잎 결점 을 취한 다.
뒤의 마지막 결점 은 뿌리 노드 이다.중간 순서 에서 이 노드 의 위 치 를 찾 습 니 다. 오른쪽 은 오른쪽 나무 이 고 왼쪽 은 이 노드 의 왼쪽 나무 입 니 다.우선 오른쪽 나무 로 돌아 가 야 합 니 다.
바로 뒷 순서 와 중간 순서 로 나 무 를 옮 겨 다 니 는 과정 을 내 놓 고 구하 면 됩 니 다.나 무 를 세 울 필요 가 없다.
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define MAXN 10005
using namespace std;
int rear[MAXN],mid[MAXN];
int hash_mid[MAXN];
int minn,pos,n,ans;
void solve(int a,int b ,int sum)
{
    if(a>b) return ;
    pos--;
    sum+=rear[pos];
    if(a==b)
    {
       if(sum<minn)
       {
           minn=sum;
           ans=rear[pos];
       }
       else if(sum==minn)
        ans=min(ans,rear[pos]);
    }
    else
    {
        int c=hash_mid[rear[pos]];
        solve(c+1,b,sum);
        solve(a,c-1,sum);
    }
}
int main()
{
    char c;
    int temp;
    while(scanf("%d%c",&temp,&c)!=EOF)
    {
        n=0;
        memset(hash_mid,0,sizeof(hash_mid));
        memset(mid,0,sizeof(mid));
        memset(rear,0,sizeof(rear));
        mid[n]=temp;
        hash_mid[mid[n]]=n;
        n++;
        if(c!='
') { while(scanf("%d%c",&mid[n],&c)) { hash_mid[mid[n]]=n; n++; if(c=='
') break; } } n=0; while(scanf("%d%c",&rear[n],&c)) { n++; if(c=='
') break; } minn=10000*10000; pos=n; ans=MAXN; solve(0,n-1,0); printf("%d
",ans); } return 0; }

좋은 웹페이지 즐겨찾기