计算单调的子树

时间:2015-09-08 12:59:16

标签: c++ data-structures tree

在最近的一次Codechef比赛中,我不得不编写一个程序来计算给定树中未计算的子树数。如果子树的所有节点具有相同的值,则子树是唯一的。

在输入中,节点编号为0到N-1。每个节点都包含一个整数值。每个节点可以具有到其他节点的任何数量的边缘。总共有N-1个边缘。树始终以节点0为根。

我写了下面的代码:

struct Node {
    int data;
    vector<unsigned> edge; //stores the node number of each child node
};

//i know these really shouldn't be global
unsigned long long count = 0;
vector<Node> tree;

//n is the number of the node at which the tree is rooted
//initally we call isUnivalued(0)
bool isUnivalued(unsigned n) {
    if(tree[n].edge.size() == 0){
        count++;
        return true; //leaves are univalued
    }
    bool allUnivalued = true;
    for(auto i : tree[n].edge)
        if(!isUnivalued(i))
            allUnivalued = false;
    if(!allUnivalued)
        return false;
    for(auto i : tree[n].edge)
        if(tree[i].data != tree[n].data)
            return false;
    count++;
    return true;
}

这给出了我尝试的所有小测试案例的正确答案。但是当我提交问题时,法官发现某些测试用例的答案不正确。

我正在寻找一些帮助,找出在什么条件下这可能会失败以及原因。

编辑:示例

  0
 / \
0   1
   / \
  1   1

这里的答案应该是4.虽然最大的子树(整棵树本身)不是唯一的,但所有其他的子树都是。 假设所有节点的值都为1,则答案为5。

1 个答案:

答案 0 :(得分:1)

  • 在谈到要点之前,lemme为您提供了一个很好的方法,可以在不使用pen&paper
  • 的情况下使用长测试框检查您的提交内容

首先,尝试找出一种可以并行执行原生代码的替代方法,同时比较给定的结果

直到命中条件断点,然后检查它。

第二,在运行两种相似的方法之后,结果没有出现这种差异,这意味着你方法的各个方面

除了一个单独的执行之外是完全正确的,在重复过多的调用之后这是一个最终的stack overflow,这可能会引起内存过载。

将结构化树视为输入(但我不确定如何将输入引入系统)

import re

start = set()
genes = set()

with open('input.txt', 'r') as f_input:
    for line in f_input:
        s, g = re.match(r'(?:.*?\s+){3}(\d+).*"(\w+)"', line).groups()
        start.add(s)
        genes.add(g)

print start
print genes

树[k]和树[k + 1]是叶子,堆栈的结构如下......

V1,V2,V3,V4,... VK,VK + 1,-1,VK + 2,-1,-1,+ VK 3,...

这棵树是单线程的,意味着它是线性计算。

举个例子:

级别= 0,计数= 0。

set(['44160380', '29037032', '103356007', '19563636', '53373540', '52870219', '11839859'])
set(['COL11A1', 'PRPF38A', 'KDM4A', 'C1orf167', 'EMC1', 'GMEB1', 'ECHDC2_dup2'])

树:

tree[0] , tree[1]  , tree[2]  , tree[3]  ,..., tree[k-1], tree[k]  , tree[k+1],  tree[n]   ,...  
        |          |          |          |...|          |          |          |            |... 
{v1,1,n}|{v2,2,n-1}|{v3,3,n-2}|{v4,4,n-3}|...|{vk,k,k+1}|{vk+1,0,0}|{vk+2,0,0}|{vn+1,n+2,L}|...

等级:

1      ,1      ,1      ,1      ,-1     ,1      ,-1     ,-1     ,0    (data changed),-1     ,-1     ,1      .
level=0,level=1,level=2,level=3,level--,level=3,level--,level--,reset(level)level=1,level--,level=0,reset(level=1) (data changed)
count=1,count=2,count=3,count=4,count=4,count=5,.......,.......,count=count-level+1,count=4,.......,count=count-0+1=5 (data changed)

计数:

            --------1-------        
           -----1----       1   
          --- 1---    0
          1       1        

子树数量:5

            --------0-------        
           -----1----       1   
          --- 2---    1
          3       3        

- 左边的情况(树的混乱索引和错误结构),这里是如何验证我的,以及你的算法收集,

看到数字和时间结果:

代码:

            --------1-------        
           -----2----       5   
          --- 3---    4
          4       5        

online comparison