给定具有任何类型连接的无向加权图,即它可以包含1到几个有或没有单个节点的组件,每个节点可以有0到多个连接,允许循环(但是没有从节点到自身的循环)
我需要找到最大量的顶点对,假设每个顶点只能使用一次,例如。如果图表有节点1,2,3而节点3连接到节点1和2,则答案是1(1-3或2-3)。
我正在考虑以下方法:
我的问题是:
有没有更快更正确的算法?
我可以使用java或python,但伪代码或算法描述完全没问题。
答案 0 :(得分:0)
即使在无周期图的情况下,也不能保证您的方法提供最大数量的顶点对。例如,在下图中,您的方法是选择边(B,C)。在那个不幸的选择之后,没有更多的顶点对可供选择,因此你最终会得到一个大小为1的解决方案。显然,最优解包含两个顶点对,因此你的方法不是最优的。
你要解决的问题是最大匹配问题(不要与Maximal Matching Problem混淆,这是很容易解决的):
找到边
S
的最大子集,以便S
中没有顶点出现在多个边上。
The Blossom Algorithm在O(EV^2)
中解决了这个问题。
算法的工作方式并不简单,它引入了非平凡的概念(如契约匹配,森林扩展和开花)以建立最佳匹配。如果您只是想在不完全理解其复杂性的情况下使用该算法,您可以在线找到它的即用型实现(例如this Python implementation)。