我正在研究优化问题,需要列出无向图的所有可能切割。具体来说,我有兴趣找到在两个顶点子集中断开图形的所有边缘子集。
详细说明:
在无向图G(V,E)中,其中V是顶点集,E是边集。切割形成两个顶点子集A和B,使得:
联盟 B = V
和
交叉点 B =空集
A和B建立C(E的子集),使得C中的每个边连接两个顶点,一个在A中,一个在B中。我有兴趣找到所有可能的子集C,使得:对于每个C,它是一个没有切割C'的图切割使得C'是C的子集。
非常感谢您的帮助。谢谢。
答案 0 :(得分:1)
这是我想到的一种算法。它可能不是最有效的,但会返回正确的结果。
我们的想法是从顶点开始生长一个区域,并找到分隔该区域的切割。
为此,如果已经检查过任何区域,我们将需要一个结构。一个简单的位图似乎很好。由于最多使用10个顶点,因此16位或32位整数是合适的。您可以通过将引用包含顶点的位设置为1来计算区域的索引。如果将所有检查的区域索引放在哈希集中,则可以确定是否在O中检查了任何区域(或其补码) (1)。
所以从任何顶点开始(这将形成第一个区域)。将其区域索引放在哈希集中。入射到该顶点的所有边将形成第一个切口。通过任何相邻顶点增长区域。可以通过与现有索引进行OR运算来逐步计算区域索引。第二个切口将由从区域中的两个顶点中的任何一个开始并在其他位置结束的所有边形成。遍历整个图形以查找所有可能的区域(在BFS或DFS中)。在进一步检查某个区域之前,请检查是否已检查过该区域。然后你可以打破。如果对每个顶点执行此操作,您将找到所有可能的剪切。
在报告剪辑之前,您需要检查区域的补充是否仍然连接。
答案 1 :(得分:0)
听起来任何A和B都可以形成一个切口,只要它们不相交,即A不必连接,类似于B.在这种情况下,因为你说你有10个或更少的顶点,如果你想要一些非常简单的东西,只需选择大小为5或更小(通过对称)的顶点子集A,并让B为补数,然后对每个边缘测试,如果它是A和B之间的边缘。所有这些边缘形成你的切口。存储每个切口的边缘集。最多将有512个不同的削减。
现在你说你想要" minimal"切割,即切割使得没有适当的边缘子集是切割。同样,由于您只有512个最大可能的切割,每个边缘的大小不超过(10选择5)^ 2个边缘,只需比较每对切割C1,C2,使C1的大小小于或等于大小为C2。如果您为每对切口的每个切口中的边排序,或者使用新的哈希表来对每对切割的每个切割中的边缘进行散列,这将更容易。
无论如何,重点是只有512个切口,每个切口不超过(10个选择5个)^ 2个边缘,你可以在几秒或更短的时间内完成这个计算(可能是几分之一秒)在一个优秀的现代CPU上,至少如果你在较低级别的语言如java或c / c ++中有一个不错的实现。