zoukankan      html  css  js  c++  java
  • uva 548 Tree

    //提交通过,0.092,不算太快,先给出代码

     

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX 10010
    #define INF 100000010
    struct treenode
    {
        int data,lchild,rchild,level;
    };
    int *start,*flag;
    int min,leaf,pre,value;
    
    int input(int *post , int *ind)
    {
        int i,len;  char ch;
        i=0;
        while(1)
        {
            if(scanf("%d",&ind[i++])==EOF) return 0; 
            ch=getchar(); if(ch=='\n')  break;
        }
        i=0;
        while(1)
        {
            if(scanf("%d",&post[i++])==EOF) return 0; 
            ch=getchar(); if(ch=='\n')  break;
        }
        return len=i;
    }
    int find(int len , int *s2 ,int key)
    {
        int i;
        for(i=0; i<len; i++)  if(s2[i]==key)  return i;
        return i;
    }
    void build_treenode_post_and_ind(int len , int *s1 , int *s2 , struct treenode *tree , int mark , int level)
    {
        int x,y,p;
        if(len<=0)
        {
            x=flag-start;
            if(mark==1)  tree[x].lchild=-1;
            if(mark==2)  tree[x].rchild=-1;
            return ;
        }
        x=flag-start;  y=s1+len-1-start;  
    tree[y].data=s1[len-1]; tree[y].level=level; level++;
        if(mark==1)            tree[x].lchild=y;
        else if(mark==2)    tree[x].rchild=y;
        p=find(len,s2,s1[len-1]);  
        flag=s1+len-1;  mark=1;
        build_treenode_post_and_ind(p,s1,s2,tree,mark,level);
        flag=s1+len-1; mark=2;
        build_treenode_post_and_ind(len-p-1,s1+p,s2+p+1,tree,mark,level);
    }
    void DFS(struct treenode *tree , int s , int sum)
    {
        int L,R;
        if(s<0)  
        {
            if( (tree[pre].lchild==-1 && tree[pre].rchild==-1) && 
    ( sum<min || (sum==min && tree[pre].data<value) )  )
            { min=sum; leaf=pre; value=tree[pre].data; }
            return ;
        }
        else 
        {
            sum+=tree[s].data;  L=tree[s].lchild; R=tree[s].rchild;
            pre=s;  DFS(tree,L,sum);
            pre=s;    DFS(tree,R,sum);
        }
    }
    int main()
    {
        int i,len,level,mark,sum; int post[MAX],ind[MAX];  struct treenode tree[MAX];
        while(1)
        {
            len=input(post , ind);    if(!len) return 0;
            start=post; flag=NULL; mark=0; level=0;
    tree[0].lchild=tree[0].rchild=tree[0].level=-1; tree[0].data=0;
            build_treenode_post_and_ind(len,post ,ind ,tree,mark,level);
            min=INF; sum=0; leaf=pre=len-1; value=tree[len-1].data; i=len-1;  
            //leaf保存最后的答案中叶子结点在树结点数组中的下标,valua是记录当最短路径长度一样
    //叶子结点的最小值,pre是记录前驱的下标,i是根结点下标
            DFS(tree,i,sum);  //把整个树的结点数组,根结点的下标和当前的总和传过去
    
            printf("%d\n",tree[leaf].data);
        }
        return 0;
    }

     

  • 相关阅读:
    VS快捷键
    eclipse快捷键(shift+ctrl+l能出来所有的快捷键)
    永远不要觉得自己代码有多6
    winform中使用webBrowser时如何与JS交互
    HTML CSS
    HTTP 协议 session cookie
    [Python3]Python官方文档-Python Manuals
    [python3]PyCharm编辑器
    Loadrunner上传文件与下载文件脚本
    Spotlight安装
  • 原文地址:https://www.cnblogs.com/scau20110726/p/2712634.html
Copyright © 2011-2022 走看看