这里我有一个需要帮助的dp-on-tree问题。这棵树有N个节点和N - 1条边,叶子到叶子的路径是从一个叶子节点到另一个叶子节点的路径。因此,如果树有M个叶子,则总路径为M * (M + 1)/2。
我怎样才能找到经过它的叶到叶路径最大的节点?例如,如果我有这样的树,答案是节点2。所有经过节点2的路径为:{1 ->6,1 ->7,6 ->7,1 ->4,4 ->6,4 ->7,1 ->5,5 ->6,5 ->7}。
我认为这是一个p-on-tree问题,但是我找不到函数和dp-公式。
非常感谢!另外,如果有的话,请给我看几行代码。
例子
给定合适的struct node { int id; node *left, *right;}
和预先创建的树:
std::tuple<node*, int> max_candidate{nullptr, -1};
void report(node *root, int paths) {
if (paths > std::get<1>(max_candidate)) {
max_candidate = {root, paths};
}
}
int visit(node *root) {
if (!root)
return 0;
if (!root->left && !root->right)
return 1;
int leaves_left = visit(root->left);
int leaves_right = visit(root->right);
report(root, leaves_left * leaves_right);
return leaves_left + leaves_right;
}