如何将此生成树问题减少到 np-completeness?

how do I reduce this spanning tree problem to np-completeness?

我有以下算法问题:

如果我有一个图 G=(V,E),G 是否有恰好有 k 个叶子的生成树? 叶子是生成树中只有一个邻居的顶点。 另外,我不是在寻找最小生成树,只是一个生成树。

总而言之,解决方案算法会将图 G 和数字 k 作为输入,return 为真或为假,具体取决于 G 是否具有 k 叶的生成树

示例: 对于此图:

如果 k 是 6,那么我的算法将输出“真”,因为:

现在我很确定这个问题是 np-complete,所以我需要对一个已知的 np-complete 问题进行归约。

我只是不知道是哪个问题,减少应该是什么样子,你能帮忙吗?

Hamiltonian path problem 是您问题的一个特例 - 恰好有 k = 2 个叶子的生成树是哈密顿路径。测试一个是否存在是 NP 完全的。

不是您问题的真正答案,但您可能想在开始使用这些 1.x^N 算法之前尝试简化图表

简化事情(前方未经测试的代码)

if (nodes.size() < K)
  return false;

移除所有只有一条边的节点,因为它们被迫成为叶子。

while (nodes && nodes.front().edges.size() == 1) {
  nodes.erase(nodes.begin()); // updates one other node which could have 1 edge then.
  K--;
}

if (K < 0 || nodes.size() < K)
  return false;

删除所有有 2 条边的节点,如果删除一条边会断开图形,则直接连接它连接的两个节点。如果从 edge1 到 edge2 有任何路径,则它不是桥。 O(N^2)

node = nodes.begin();
while (node->edges.size() == 2) {
  if (DisconnectingBrigde(node)) {
    edges = node->edges;
    node = nodes.erase(node); // returns next node
    nodes.addEgde(edges.front(), edges.back()); // connect the two parts
  } else
    node++; // next node
}