有人可以帮我解决这个问题吗?解决方案显然是使用网络流量,但我不是很熟悉网络流量。网络流程如何帮助您解决这个问题?
螃蟹是一种无向图,它有两种顶点:1个头和K英尺,正好是将头部连接到每个腿的K个边缘。(1 <= K <= T,其中T给出了)
给定一个无向图,你必须在其中找到一些顶点不相交的子图,其中每个子图都是一个螃蟹。目标是选择那些螃蟹,使它们所覆盖的顶点总数最大化。
注意:如果两个图形没有任何共同的顶点,则它们是顶点不相交的。
前。输入
8 2 7
1 4
2 4
3 4
5 4
5 8
5 7
5 6
答案 0 :(得分:5)
考虑如何将网络流量应用于此问题。 这应该是一种流动从螃蟹的头部流到它的脚。并且流到头部的流量应该具有相当于英尺数的值,并且从头到脚的每个边缘应该具有容量1。
我们如何实现这一目标? 自己来到这里肯定很难,但我希望在多次看到这个例子之后,你可以掌握这个。
我们必须创建一个新的图形,其中原始顶点是重复的。 一组可以给每个顶点有机会成为头部而另一组可以作为脚。 记住这一点,准确的算法可以写成如下: -
1. We create a new graph where original vertices are duplicated (vertex i becomes 2*i (head set) and 2*i+1 (feet set) ).
2.For i and j vertices connected in original graph make sure that 2*i and 2*j+1 plus 2*j and 2*i+1 gets connected in new graph with capacity 1.
3.source vertex (S) is connected to each 2*i vertex(head set) with capacity min(T, degree).
4. Each 2*i+1(feet set) vertex is connected to target vertex (T) with capacity 1
5. Maxflow is the answer.
下面的图片可以很好地了解图表的形成方式。 New Graph formation
第3点的说明: - 耳机中的每个顶点应与容量min(t,degree)的源连接,因为如果我们希望此边缘的最大流量与T一样大,而不是更多比起因为螃蟹不能超过t英尺而且这里的容量值也受到连接0的顶点的程度的限制。头部不能超过其度数。
第4点的解释: - 为了确保对不相交,使每个顶点只有一个螃蟹,每个脚与容量1连接到图中的目标10。
如果需要,我可以发布代码。
答案 1 :(得分:1)
这是一个vertex cover问题。对于图的顶点覆盖,蟹头是顶点覆盖的顶点,而脚是连接到这些头的顶点。应该移除重复的脚,同时小心不要移除一只螃蟹的所有脚: - )
<强>更新强>
最小顶点覆盖是NP完全,什么不好:-)我认为蟹盖是等价的。至少有最小的螃蟹覆盖,我们可以获得最小的顶点覆盖。因此,如果最小的螃蟹不是NP完全的,那么最小的顶点覆盖也不应该是NP完全的。
让我们证明,只有最小的螃蟹覆盖物,我们可以获得最小的顶点覆盖。以标准的方式,我们得到顶头盖与蟹头。相反,假设有一个较低程度的顶点覆盖,覆盖的顶点比蟹头少。对于那个顶点覆盖,我们可以构造相同程度的蟹盖,除了我们不确定是否有一只没有脚的螃蟹因为去除了重复的脚。只有当一个头部与另一个头部没有任何其他头部的其他头部共用时,才会出现这种情况。在这种情况下,我们可以通过移除这两个头并在该关键脚上设置头来构造甚至更小的顶点覆盖。因此,我们有一个矛盾,所以没有顶点覆盖较少的顶点。所以最小的蟹盖也是最小的顶盖。
答案 2 :(得分:1)
通过顶点覆盖方法解决上述问题导致指数时间算法 但这可以通过使用Ford Fulkerson算法最大化流量来解决 上述问题可以通过Ford Fulkerson解决。
Ford Fulkerson算法在给定图中找到最大流量
重复上述4个步骤,直到无法增加路径。
选择一条可能的路径并识别容量最小的边缘。 记录这个数字 从该路径上的每个数字中减去此数字。这是每个弧长路径的新容量。 选择另一条路线并重复步骤1再次记录最小容量。 重复,直到所有可能的路径都耗尽。 添加所有路径的最小容量。这是网络的最小承载能力
参考
http://anandtechblog.blogspot.in/search/label/Ford%20Fulkerson%20algorithm