algorithm - 图算法思想

标签 algorithm graph

您好,谁能提示一下这个问题的潜在图问题是什么?

https://icpcarchive.ecs.baylor.edu/external/64/6450.pdf

我个人是这样想的:

通过递减边数对图的节点数进行排序。然后选择最上面的一个。之后忽略此顶部节点连接到的所有节点。然后选择下一个。

第一个测试用例

答案是 1,因为图是完全连接的,选择任何节点都将确保覆盖所有其他节点。

第二个测试用例

我们可以选择节点 5(这将覆盖节点 1、2 和 4)。然后我们可以选择节点 3。这样所有节点都被覆盖了。

问题是这种方法在我看来只是编造的一种。这不是任何图形算法。

如果有人能给出提示就太好了。谢谢。

VVV

最佳答案

这是 Dominating Set问题,这是 NP 难的,所以除非 P = NP,否则它没有多项式解。

请注意 n < 20,幸运的是我们仍然可以足够快地解决它。对于每个用户 0 ≤ i < n,让我们用位掩码 b(i) 表示其邻域,其中 n 位已设置所有位表示从 i 可通过长度 ≤ 1 的路径到达的用户。我们可以在 O(n²) 中预先计算 b(i)

让我们将 f(i,m) 定义为达到由位掩码 m 表示的所有用户所需的最小用户数,仅在用户墙上发帖索引 ≤ i。我们可以使用以下算法计算 f:

f(i,m) = ∞  for all i, m
f(0, 0) = 0
f(0, b(0)) = 1
for i = 1 to n - 1:
    for m = 0 to 2^n - 1:
        f(i, m) = min(f(i, m), f(i - 1, m))
        f(i, m | b(i)) = min(f(i, m | b(i)), f(i - 1, m) + 1)    

答案是f(n - 1, 2^n - 1)。运行时间:O(n * 2^n)

关于algorithm - 图算法思想,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22154979/

相关文章:

C++如何在不使用排序的情况下打印大小为n的数组中的最小数字

c++ - 二元归并排序和自然归并排序

java - 如何通过 Java 中的递归深度优先搜索确定图中两个节点是否相连?

algorithm - 确定 DAG 是否具有从所有其他顶点可达的顶点的线性时间算法?

c - 找出循环序列中的旋转次数

同义词库的 Python 数据结构

algorithm - 计算图的最短路径时, "relax"操作的名字应该怎么理解?

java - 具有 N 个标记顶点和 K 个未标记边的简单连通图的数量

algorithm - 具有燃料约束和可变加油的最短路径算法

ruby - 我们如何在 Ruby 中进行图形表示