如何使用Mathematica 8找到加权二分图的最小边缘覆盖?

时间:2011-09-11 02:23:05

标签: graph wolfram-mathematica

在图论中,我们使用匈牙利算法计算加权二分图的最小边缘覆盖(一组入射到每个顶点的边,即总重量最小的边)。

我发现在Mathematica的新版本8中,图形理论有一个全新的函数包,(以Graph []开头。)但是我找不到任何能完成这项工作的函数。我找到了一个名为FindEdgeCover []的函数,它只能找到边缘覆盖,而不是最小的。

1 个答案:

答案 0 :(得分:6)

我做了一些实验,虽然没有记录,似乎FindEdgeCover[]做了你想要的。

考虑例如:

 h[list_] := CompleteGraph[4, EdgeWeight -> list]

 FindEdgeCover[h@Range@6]
 (*
 ->  {1->2,1->3,1->4}
 *)

但是

 FindEdgeCover[h@Reverse@Range@6]
 (*
 -> {1->2,3->4}
 *)

当然没有保修......

修改

这里有一些代码可以通过使用不同的加权邻接矩阵进行试验

adj = {{\[Infinity], 1, 1, 1, 1}, {1, \[Infinity], 2, 2, 2}, 
       {1, 2, \[Infinity], 2, 2}, {1, 2, 2, \[Infinity], 2}, 
       {1, 2, 2, 2, \[Infinity]}}
g = WeightedAdjacencyGraph[adj];
g = WeightedAdjacencyGraph[adj, VertexShapeFunction -> "Name", 
  EdgeLabels -> 
   MapThread[
    Rule, {EdgeList@g, AbsoluteOptions[g, EdgeWeight] /. {_ -> x_} -> x}], 
  GraphHighlight -> FindEdgeCover[g]]

enter image description here

注意:代码根本不好,但我找不到使用EdgeLabels -> “EdgeWeight”的方法。我发布了this question以查看是否有人可以这样做。