当前位置: 首页 > 知识库问答 >
问题:

找出无向图的所有可能的切口

丌官嘉福
2023-03-14

我正在研究一个优化问题,需要列出一个无向图的所有可能割集。具体来说,我感兴趣的是在两个顶点子集中找到所有断开图的边子集。

详细地:

在无向图G(V,E)中,V是顶点集,E是边集。割形成两个顶点子集a和B,这样:

A联合B=V

A交叉点B=空集

A和B建立C(E的子集),使得C中的每条边连接两个顶点,一个在A中,一个在B中。我感兴趣的是找到所有可能的子集C,这样:对于每一个C,它是一个图的割,没有割C,C'是C的子集。

非常感谢你的帮助。谢谢你。

共有2个答案

祁权
2023-03-14

听起来任何一个A和B都可以形成一个切口,只要它们是不相交的,也就是说,A不必连接,对B来说也是如此。在这种情况下,既然你说你有10个或更少的顶点,如果你想要一个非常简单的东西,只要从大小为5或更小的顶点子集中选择一个,让B作为补充,然后对每个边缘进行测试,看它是否是A和B之间的边缘。所有这些边缘都形成了你的切口。为每个切口存储一组边缘。最多会有512个不同的切口。

现在您说您想要“最小”切割,即切割使得没有合适的边缘子集是切割。同样,由于您只有512个最大可能的切割,每个边缘的子集大小不超过(10选择5)^2个边缘,只需比较每对切割C1、C2,使得C1的大小小于或等于C2的大小。如果您对每对切割的每个切割中的边缘进行排序,或者使用新的哈希表对每对切割的每个切割中的边缘进行散列,这将会更容易。

无论如何,关键是,只要有512次切割,每一次切割不超过(10次选择5次)^2条边,你就可以在一个好的现代CPU上用几秒钟或更短的时间(可能是几分之一秒)完成这个计算,至少如果你有一个像java或c/c这样的低级语言的不错的实现。

白念
2023-03-14

我想到了一个算法。它可能不是最有效的方法,但会返回正确的结果。

其思想是从一个顶点开始生长一个区域,并找到分割该区域的切口。

为此,我们需要一个结构,如果已经对任何地区进行了审查,该结构将保持不变。一个简单的位图似乎就可以了。由于最多使用10个顶点,因此16位或32位整数是合适的。通过将引用包含顶点的位设置为1,可以计算区域的索引。如果你把所有检查过的区域索引放在一个散列集中,你可以发现是否有任何区域(或其补码)在O(1)中检查过。

所以从任何顶点开始(这将形成第一个区域)。将其区域索引放入哈希集中。与该顶点相关的所有边将形成第一个切割。按任意相邻顶点增长该区域。通过对现有索引进行ORing,可以增量计算区域索引。第二个切割将由从该区域的两个顶点中的任何一个开始并在其他地方结束的所有边形成。遍历整个图形以找到所有可能的区域(在BFS或DFS中)。在进一步检查某个区域之前,请检查该区域或其补体是否已被检查过。然后你就可以Rest了。如果你对每个顶点都这样做,你会发现所有可能的切割。

在报告切割之前,需要检查该区域的补体是否仍然连接。

 类似资料:
  • 我有一个无向图,我想从一个起始节点列出所有可能的路径。2个节点之间的每个连接在列出的路径中是唯一的,例如,给出以下图表示: 我无法使用现有的算法来完成它,我知道像DFS。任何帮助都将非常感谢。

  • 我需要找到一个算法来找到有向图中的所有根,在O(n m)。 我有一个寻找单个根的算法: 在v中的某些v上运行DFS(v)。如果结果是一个生成树,则v是根。否则,结果就是树木成林。然后: 在最后一棵树的根上运行DFS(u)。如果结果是一棵生成树,那么u是根。否则,图中没有根 现在,如果我想找到所有的根,最好的方法是每次在最后一棵树的不同顶点上运行上述算法O(n)次吗?假设我找到了一个根,如果另一个根

  • 注意,有一个多边形ABCIHGJKLMLKA,它包括节点KLM,但多边形CDEG不包括F。 我读过关于这个问题的解决方案,但没有像我这样的leaf要求。在以前的解决方案中存在的一些公理是,每条边只使用两次,但是死端边总共需要遍历四次。也就是说,存在一个包含所有外部节点ABCDEFGJKLMLKA的多边形,但是它会被丢弃,因为它将朝外。 下面介绍了一种类似问题的解决方案,即sans the leaf

  • 我有以下Java代码,可以在图中找到从一个节点到另一个节点的路径,如何修改它,以便显示所有可能的路径。这里只显示了一条路径,它是一个循环? 输出:路径:[1、2、3、4、1] 对于节点1和4之间的路径,正确的输出应该是: 第一条路径:1- 第二条路径:1- 代码:

  • 因此,在Hackerrank上的一个名为“非循环图”的编程竞赛中出现了这个挑战,它基本上可以归结为计算“有向非循环图”中每个节点可达的节点数。例如,假设你有一个这样的图: 可达性计数(包括源节点): 我的方法是“深度优先”遍历和记忆。环顾四周,但似乎运行时间无法进一步提高,因为在以下情况下会出现过度计数: 第三个节点将计算第四个节点,即使第二个节点已经计算了第四个节点。更糟糕的是,我只用JavaS

  • 给定一个一般的无向图,如何在O(n+m)时间内打印出图的所有双连通分量?我知道Tarjan的算法,用于输出无向图的所有连接点,但我发现很难扩展该算法来打印双连接的组件。我试着搜索google,但我得到的所有结果都不能用于我的测试用例,因为它们错过了算法的边缘情况。 编辑:我已经成功地实现了Niklas提供的这个链接中描述的算法。现在我有一个不同的问题,我如何找出一个不含边的无向图的子图,如果删除它