【发布时间】:2016-10-08 10:09:32
【问题描述】:
如何找到给定图的最大欧拉子图? “最大”是指具有最大数量的边、顶点或两者的子图。我的想法是找到循环空间的基础并以适当的方式组合基础循环,但我不知道该怎么做(这是否是一个好主意)。
UPD。源图已连接。
【问题讨论】:
标签: graph-algorithm graph-theory cycle subgraph
如何找到给定图的最大欧拉子图? “最大”是指具有最大数量的边、顶点或两者的子图。我的想法是找到循环空间的基础并以适当的方式组合基础循环,但我不知道该怎么做(这是否是一个好主意)。
UPD。源图已连接。
【问题讨论】:
标签: graph-algorithm graph-theory cycle subgraph
一些想法。图是欧拉图,当且仅当它是连通的(具有可能的孤立顶点)并且所有顶点的度数相等。
通过删除奇数度顶点对之间的(最短)路径来满足第二个标准是“容易的”。
连通性是有问题的,因为删除边会产生不连通的图。
一个例子表明“简单”(贪婪)解决方案不容易产生。通过将每条边分成两条(或更多条)边来修改完整图 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 顶点完成。
【讨论】: