在图论中,我们使用匈牙利算法计算加权二分图的最小边缘覆盖(一组入射到每个顶点的边,即总重量最小的边)。
我发现在Mathematica的新版本8中,图形理论有一个全新的函数包,(以Graph []开头。)但是我找不到任何能完成这项工作的函数。我找到了一个名为FindEdgeCover []的函数,它只能找到边缘覆盖,而不是最小的。
答案 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]]
注意:代码根本不好,但我找不到使用EdgeLabels -> “EdgeWeight”
的方法。我发布了this question
以查看是否有人可以这样做。