在这种情况下:
U = {A,B,C}
V = {D,E,F}
E = {(A->E,7), (B->D,1), (C->E,3), (F->A,9)}
定义: DirectionalMatching (我编写这个术语只是为了让事情变得更清晰):可以共享起点或终点顶点的有向边集。也就是说,如果U-> V和U' - > V'都属于 DirectionalMatching ,那么V / = U'和V'/ = U但是它可能是U = U'或V = V'。
我的问题:如何有效地找到上面定义的 DirectionalMatching ,以获得最大化其边缘权重之和的二分方向加权图?
有效,我的意思是多项式复杂性或更快,我已经知道如何实现一种天真的暴力方法。
在上面的示例中,最大加权 DirectionalMatching 是:{F-> A,C-> E,B-> D},值为13.
正式证明这个问题与图论中任何其他众所周知的问题的等价性也是有价值的。
谢谢!
注1:此问题基于Maximum weighted bipartite matching _with_ directed edges,但需要额外放宽,以便匹配中的边缘共享原点或目的地。由于这种放松产生了很大的不同,我创造了一个独立的问题。
注2:这是最大重量匹配。基数(存在多少条边)和匹配所覆盖的顶点数与正确的结果无关。只有最大的重量很重要。
注2:在我研究解决问题的过程中,我发现了这篇论文,我认为对其他试图找到解决方案的人有帮助:Alternating cycles and paths in edge-coloured multigraphs: a survey
注3:如果有帮助,您还可以将图形视为等效的2边彩色无向二分多图。然后问题公式将变为:找到没有颜色交替路径的边集或具有最大权重和的周期。
注4:我怀疑这个问题可能是NP难的,但我不是那种减少经验的人,所以我还没有成功证明这一点。
又一个例子:
想象一下你有
4个顶点:{u1, u2}
{v1, v2}
4条边:{u1->v1, u1->v2, u2->v1, v2->u2}
然后,无论权重如何,u1->v2
和v2->u2
都不能在同一 DirectionalMatching 中,v2->u2
和u2->v1
也不能。但u1->v1
和u1->v2
可以,u1->v1
和u2->v1
也可以。
答案 0 :(得分:10)
从G'
定义新的无向图G
,如下所示。
G'
在(A, B)
w
的每个定向边(A, B)
都有一个权重为w
的节点G
如果(A,B)和(B,C)都是G中的有向边,则G'
具有无向边((A, B),(B, C))
http://en.wikipedia.org/wiki/Line_graph#Line_digraphs
现在在G'
中找到一个最大(加权)的独立顶点集。
http://en.wikipedia.org/wiki/Vertex_independent_set
通常这将是NP难问题。但是,G'
是一个二分图 - 它只包含偶数周期。在二分图中查找最大(加权)独立顶点集是不 NP-hard。
您将在G'
上运行的算法如下。
G'
的关联组件,说H_1, H_2, ..., H_k
H_i
做2个着色(比如红色和蓝色)的节点。这里的食谱方法是对H_i
交替颜色进行深度优先搜索。一种简单的方法是根据H_i
中相应的边缘是从G
变为U
(红色)还是从V
为V
中的每个顶点着色到U
(蓝色)。H_i
中选择节点的两个选项是所有红色节点或所有蓝色节点。选择具有较高权重的彩色节点集。例如,红色节点集的权重等于H_i.nodes.where(node => node.color == red).sum(node => node.w)
。调用较高权重的节点集N_i
。union(N_1, N_2, ..., N_k)
。由于G'
中的每个顶点都对应G
中的一个有向边,因此您拥有最大的DirectionalMatching。
答案 1 :(得分:-2)
使用Hungarian Algorithm可以在多项式时间内解决此问题。 Vor上面的“证明”是错误的。
为上述示例构建问题的方法如下:
D E F
A # 7 9
B 1 # #
C # 3 #
其中“#”表示负无穷大。然后使用匈牙利算法解析矩阵以确定最大匹配。如果要查找最小匹配,可以将数字乘以-1。