Algorithm 通过在每个步骤中递增asjacent节点,找到使所有树节点为零所需的最小值

Algorithm 通过在每个步骤中递增asjacent节点,找到使所有树节点为零所需的最小值,algorithm,tree,nodes,Algorithm,Tree,Nodes,问题在于找到使所有节点为零所需的最小值,我们称之为K 给出了一个非二叉数树 在第一步中,可以选择一个节点开始。如果K大于该节点的值,则将该值更改为零,并增加距离为1或2的其他节点的值。请注意,一旦节点的值变为零,它将不再递增,并且不允许连接到它的节点递增 然后,您应该选择另一个节点,该节点在距离1处至少有一个零值节点,并重复该过程 例子: 当我们从值为5的叶子开始时,我们有 6 \ 3 \ 0 那么我们应该选择3;我们不能选择6,因为它在距离1中没有零节点 7 \ 0

问题在于找到使所有节点为零所需的最小值,我们称之为K

  • 给出了一个非二叉数树

  • 在第一步中,可以选择一个节点开始。如果K大于该节点的值,则将该值更改为零,并增加距离为1或2的其他节点的值。请注意,一旦节点的值变为零,它将不再递增,并且不允许连接到它的节点递增

  • 然后,您应该选择另一个节点,该节点在距离1处至少有一个零值节点,并重复该过程

  • 例子: 当我们从值为5的叶子开始时,我们有

    6
     \
      3
       \
        0
    
    那么我们应该选择3;我们不能选择6,因为它在距离1中没有零节点

    7
     \
      0
       \
        0
    
    最后我们选择7,K=7,但如果我们首先选择2,则我们有:

    6
     \
      0
       \
        6
    
    那么我们应该选择6;因为值为2的节点现在为零,所以连接被切断,通过更改值为6的节点的值,将不会再发生增量

    0
     \
      0
       \
        6
    
    所以最小K=6

    我目前的做法是:
  • 找到最大节点并从它开始(如果有多个最大节点,则选择较早出现的一个)

  • 我定义了一个数组,我们称之为可能的节点,并将步骤1中找到的节点添加到该数组中

  • 虽然可能的节点不是空的,但我执行以下步骤:

    a。选择可能节点中的最大值;我们称之为max_节点

    b。使最大节点功率为零并更新K

    c。增加其父级、外祖级、子级、外祖级和兄弟级的值(如果它们以前不是零)

    d。将其具有非零值的父节点和子节点添加到可能的节点

    e。从可能的节点中删除max_节点

  • 实际上这是一个家庭作业问题,但这种方法并不正确!它给出了错误的答案并达到了超时限制

    约束条件
    • 节点数≤ 3×105

    • -109≤ 节点值≤ 109

    • 时限:2.5秒

    • 内存限制:256 MB


    如果从树中的随机节点开始,则K是最大值:

  • 开始节点
  • 它的孩子们+1
  • 其父代+1
  • 所有其他节点+2
  • 这是因为您只能选择相邻节点为0的节点,并且这些节点不会递增

    我们可以得出结论,Kmin必须介于max和max+2之间

    所以O(n)算法可以如下所示:

  • 找到最大节点值
    max
    并计算有多少节点具有该值=>
    maxCount
  • 如果
    maxCount=1
    则计算有多少节点具有值
    max-1
    =>
    max1Count
    ,有两种可能性:
  • max1Count=0
    或值为
    max-1的节点的相邻节点数
    max
    等于
    max1Count
    =>解决方案为
    max
  • 否则,解决方案为
    max+1
  • 查找树中具有最高
    max
    值的所有节点:
  • 如果第一次出现的
    max
    的深度仅找到一个节点:
  • 值为
    max
    的子级数等于
    maxCount-1
    =>解决方案是
    max+1
  • 只有一个子项的值
    max
    ,其子项的值
    max
    的计数等于
    maxCount-2
    =>解决方案也是
    max+1
  • 没有具有值
    max
    的子级,但是有
    maxCount-1
    grand子级,它们都具有相同的父级和值
    max
    =>解决方案也是
    max+1
  • 否则,解决方案为
    max+2
  • 如果找到
    maxCount
    节点,并且它们都具有相同的父节点=>则解决方案是
    max+1
  • 否则,解决方案为
    max+2

  • 一种简单的贪婪方法可能是将最短路径连续添加到零区域的下一个最大值。距离可能会有不同的测量方法(比如你在途中执行的增量数量)。请展示你当前的想法/方法?我编辑了我的问题,并添加了我当前的方法@Pham TrungThanks作为你的答案,但我对树木有点陌生,请你分享一个关于你的方法的链接,或者解释一下@Nico SchertlerI编辑的@范忠
    0
     \
      0
       \
        6