【问题标题】:Give an efficient greedy algorithm that finds an optimal vertex cover for a tree in linear time给出一个高效的贪心算法,在线性时间内找到一棵树的最优顶点覆盖
【发布时间】:2014-11-18 02:18:38
【问题描述】:

我正在努力解决这个问题... 下面提到的是一种算法..我想通了..

输入图表 选择与所有其他节点匹配度最高的顶点。 移除在该节点上发生的边。 将选定的顶点及其边添加到集合 X。 返回 X

X 返回顶点覆盖所需的最小顶点集。这种方式是否正确...? 谢谢

【问题讨论】:

    标签: algorithm greedy vertex-cover


    【解决方案1】:

    选择度数最高的顶点并不能保证给出最佳解决方案。例如, 你有一棵有 7 个顶点的树,边的列表如下:

    1 2 // (1,2) is connected.
    1 3
    1 4
    2 5
    3 6
    4 7
    

    最小顶点覆盖是{2,3,4},但是,根据你的贪心方法,你会先选择{1},然后你会选择至少3个顶点来覆盖左边的3条边。

    确实,有一种贪心算法可以解决一棵树的顶点覆盖问题,即在每一步找到一个叶子(因为输入是一棵树,所以除非没有边,否则总是可以找到这样的叶子) ,然后选择顶点覆盖集X的叶子的邻居。返回X作为图为空时的最小顶点覆盖。当 E = V-1 时复杂度为 O(E),因此我们可以说它是一个线性解。

    【讨论】:

    • 但你为什么说它是最优的呢?
    • 说 v2 是一片叶子,它与 v1 相连。如果要覆盖边 {v1, v2},可以有两种选择,但选择 v1 总是比选择 v2 更好,因为 v1 可能会覆盖除 {v1, v2} 之外的更多边
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多