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

xzh*_*zhu 8 wolfram-mathematica graph

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

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

Dr.*_*ius 6

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

考虑例如:

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

 FindEdgeCover[h@Range@6]
 (*
 ->  {1->2,1->3,1->4}
 *)
Run Code Online (Sandbox Code Playgroud)

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

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

编辑

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

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]]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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