【发布时间】:2015-09-08 12:59:16
【问题描述】:
在最近的 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。
【问题讨论】:
-
能不能做个通用的扫地状态验证码?
-
对不起,我不知道这意味着什么,谷歌搜索也没有帮助。你能详细说明一下吗?
-
好吧,我会这样做,但是我如何检查返回的答案是否错误,没有用笔和纸计算?
-
单值树算一还是子树数?
-
我没有看到任何错误。我能看到的唯一可能出错的情况是,当您的节点数量超过 unsigned int 可以携带的数量时。在向量中,您可以存储 size_t 元素(在大多数平台上都是 unsinged long long)。但是您的边向量只有无符号(int)作为数据类型。因此,如果您的法官确实存储了更多节点,则由于数据截断,某些边缘会出错。
标签: c++ data-structures tree