在最近的一次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。
答案 0 :(得分:1)
首先,尝试找出一种可以并行执行原生代码的替代方法,同时比较给定的结果
直到命中条件断点,然后检查它。
第二,在运行两种相似的方法之后,结果没有出现这种差异,这意味着你方法的各个方面除了一个单独的执行之外是完全正确的,在重复过多的调用之后这是一个最终的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