代码之家  ›  专栏  ›  技术社区  ›  WIZARD_

无向非加权图的最大顶点对数

  •  2
  • WIZARD_  · 技术社区  · 7 年前

    给定具有任何类型连通性的无向非加权图,即它可以包含1到多个组件,有或没有单个节点,每个节点可以有0到多个连接,允许循环(但不允许从节点到自身的循环)。

    我需要找到最大数量的顶点对,假设每个顶点只能使用一次,例如,如果图有节点1,2,3,并且节点3连接到节点1和2,则答案是1(1-3或2-3)。

    我正在考虑以下方法:

    1. 删除所有单个节点。
    2. 找到边数最少的节点与边数最多的节点之间连接的边(如果有多条,则取其中任何一条),计算并从图中删除这对节点。
    3. 当图形具有连接的节点时,重复步骤2。

    我的问题是:

    1. 它是否提供了任何情况下的最大对数?我是 担心一些极端情况,比如 单个或多个路径等。

    2. 有没有更快更正确的算法?

      我可以使用java或python,但伪代码或仅仅是algo描述就可以了。

    1 回复  |  直到 4 年前
        1
  •  3
  •   snakile    7 年前

    即使在无圈图的情况下,您的方法也不能保证提供最大数量的顶点对。例如,在下图中,您的方法将选择边(B,C)。在这一不幸的选择之后,没有更多的顶点对可供选择,因此最终将得到大小为1的解决方案。显然,最优解包含两个顶点对,因此您的方法不是最优的。

    graph

    您试图解决的问题是最大匹配问题(不要与 Maximal Matching Problem 这很容易解决):

    查找边的最大子集 S 这样就没有顶点与中的多条边关联 S .

    The Blossom Algorithm 在中解决此问题 O(EV^2) .

    该算法的工作方式并不简单,它引入了非平凡的概念(如收缩匹配、森林扩张和开花)来建立最佳匹配。如果您只是想在不完全了解其复杂性的情况下使用该算法,您可以在线找到它的现成实现(例如 this Python implementation ).