【问题标题】:How to find maximal eulerian subgraph?如何找到最大欧拉子图?
【发布时间】:2016-10-08 10:09:32
【问题描述】:

如何找到给定图的最大欧拉子图? “最大”是指具有最大数量的边、顶点或两者的子图。我的想法是找到循环空间的基础并以适当的方式组合基础循环,但我不知道该怎么做(这是否是一个好主意)。

UPD。源图已连接。

【问题讨论】:

    标签: graph-algorithm graph-theory cycle subgraph


    【解决方案1】:

    一些想法。图是欧拉图,当且仅当它是连通的(具有可能的孤立顶点)并且所有顶点的度数相等。

    通过删除奇数度顶点对之间的(最短)路径来满足第二个标准是“容易的”。

    连通性是有问题的,因为删除边会产生不连通的图。

    一个例子表明“简单”(贪婪)解决方案不容易产生。通过将每条边分成两条(或更多条)边来修改完整图 K5。取两个经过修改的 K5 图,并从每个图中取两个顶点(第一个的 A、B 和第二个的 C、D)。连接 A-C 和 B-D。贪心方法会移除这些添加的边缘,因为它们是最短路径。随着该图变得不连接。解决方案是删除路径 A-B 和 C-D。

    在我看来,算法应该在删除边的同时关注子图的连通性。当然算法应该保留奇度顶点的每个子集,其中没有对用于删除它们之间的路径,应该具有大于子集基数的连通性。

    我会尝试(进行测试)使用带有优化的递归蛮力解决方案。 O 是奇数度顶点的列表。

    def remove_edges(O, G):
      if O is empty:
        return solution
      for f in O:
        for t in O\{f}":
          G2 = G without path edges between (f,t)
          if G2 is unconnected:
            continue
          return remove_edges(O\{f,t}, G2)
    

    优化可以是通过具有最短路径的顶点对集合 O 和 O{f} 进行排序。这可以通过在移除边之前从 O 中找到所有顶点对之间的最短长度来完成。这可以通过 BFS 从每个 O 顶点完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 1970-01-01
      • 2013-08-28
      • 2015-01-09
      • 2018-04-03
      相关资源
      最近更新 更多