我有一个强连接的有向图(即,对于图G中的每对节点(i,j),存在从i到j和j到i的路径)。我希望从该图中找到一个强连通图,使得所有边的总和最小。
换句话说,我需要摆脱边缘,以便在移除它们之后,图形仍将是强连接的,并且边缘总和的成本最低。
我认为这是NP难题。我正在寻找一个最佳解决方案,而不是近似,用于一小组数据,如20个节点。
修改的
更一般的描述:给定grap G(V,E)找到图G'(V,E'),使得如果在G中存在从v1到v2的路径,则在v1和v1之间也存在路径G'中的v2和E'中每个ei的总和是最不可能的。所以它类似于找到最小等效图,只有在这里我们想要最小化边权重之和而不是边之和。
编辑:
到目前为止我的方法: 我想过使用多次访问的TSP来解决它,但这是不正确的。我的目标是覆盖每个城市,但使用最低成本路径。所以,它更像是封面设置问题,我猜,但我不完全确定。我需要使用总成本最低的路径来覆盖每个城市,因此多次访问已访问过的路径不会增加成本。
答案 0 :(得分:12)
您的问题被称为最小跨越强子(di)图(MSSS),或更一般地说,最小成本跨越子(di)图并且为NP-hard indeed。另请参阅另一本书:page 501和page 480。
我首先删除所有不满足三角不等式的边 - 你可以删除边a - > c如果去a - > b - > c更便宜。这让我想起了TSP,但不知道这是否会带来任何影响。
我之前的回答是使用解决Chu-Liu/Edmonds algorithm问题的Arborescence;正如Kazoom和ShreevatsaR指出的那样,这没有用。
答案 1 :(得分:2)
我会以动态编程的方式尝试这种方式。
0-将图表放入列表
1-制作上一个列表中每个图形的新子图表列表,其中为每个新子图形删除一个不同的边缘
2-删除新列表中的重复项
3-删除新列表中没有强关联的所有图表
4-将新列表中的最佳图表与当前最佳图表进行比较,如果更好,则设置新的当前最佳
5-如果新列表为空,则当前最佳是解决方案,否则,递归/ loop / goto 1
在Lisp中,它可能看起来像这样:
(defun best-subgraph (digraphs &optional (current-best (best digraphs)))
(let* ((new-list (remove-if-not #'strongly-connected
(remove-duplicates (list-subgraphs-1 digraphs)
:test #'digraph-equal)))
(this-best (best (cons current-best new-list))))
(if (null new-list)
this-best
(best-subgraph new-list this-best))))
strongly-connected
,list-subgraphs-1
,digraph-equal
,best
和better
的定义留给读者练习。
答案 2 :(得分:1)
此问题与此处描述的问题相同:http://www.facebook.com/careers/puzzles.php?puzzle_id=1
答案 3 :(得分:1)
很少有想法帮助我解决着名的面部谜题:
预处理步骤:
修剪:如果有更便宜或相同的费用路径,则删除所有边a-b,例如:a-c-b。
图表分解:如果图表有关节点,你可以解决子问题
如果只有一个传出边缘,则将顶点合并为一个虚拟顶点。
计算步骤:
使用定向TSP获取近似解决方案并重复访问。使用Floyd Warshall,然后使用匈牙利方法解决分配问题O(N ^ 3)。如果我们得到一次循环 - 它是指向TSP解决方案,如果不是 - 使用分支和绑定TSP。之后我们有上限值 - 最小成本的周期。
精确解决方案 - 分支定界方法。我们从最短周期中移除顶点,并尝试以比上限更低的成本构建强连通图。
这就是所有人。如果您想测试您的解决方案 - 请在此处尝试:http://codercharts.com/puzzle/caribbean-salesman
答案 4 :(得分:0)
似乎你基本上想要的是旅行销售员的最佳解决方案,允许不止一次访问节点。
编辑:
嗯。你能解决这个问题,主要是遍历每个节点i然后做一个所有边的最小生成树,指向到那个节点i,与另一个指向的所有边的最小生成树联合起来来自该节点?
答案 5 :(得分:0)
听起来您想使用Dijkstra algorithm
答案 6 :(得分:0)
最小强连通子图的2近似是通过采用最小入分支和最小出外分支的并集来获得的,两者都以相同(但任意)的顶点为根。 / p>
out-branchching ,也称为arborescence,是一个以跨越所有顶点的单个顶点为根的有向树。内侧分支与反向边缘相同。这些可以在Edmonds' algorithm及时 O(VE)中找到,并且有加速到 O(E log(V))(参见{{3 }})。甚至有wiki page。
2近似结果的原始参考是open source implementation,但论文无法自由访问。
Adrian Vetta paper by JaJa and Frederickson甚至有3/2的近似值,但比上面更复杂。