我有一个无向图G(V,E)。我试图解决的问题分为两部分:
第1部分:给定图形和图形中的一对顶点,找到包含在这对节点之间的所有路径中的边。
第2部分:给定图形,找到所有这样的边,使得每个边沿图中任意两个顶点之间的所有路径存在。
第2部分的示例:
让图表有节点{a, b, c, d, e, f, g}.
设边是:
{a, b},
{b, c},
{c, a},
{c, d},
{d, e},
{e, f}
{f, g},
{g, e}
对于此图,{c,d}和{d,e}应为返回的边。
你怎么能有效地做到这一点?
答案 0 :(得分:1)
如果边E位于从顶点A到顶点B的路径上,但是也存在从A到B的不包含E的路径,那么E就处于循环中。
如果E处于一个循环中,并且E位于从A到B的路径上,那么从循环中的A到B之间通过其他边缘的路径不包括E.
因此,您在第2部分中寻找的边是不在循环中的边,这些边也在从A到B的路径上。
回答你的问题:
1)使用Hopcroft / Tarjan算法查找图中所有双连通分量(周期)。见https://en.wikipedia.org/wiki/Biconnected_component
2)将每个双连通分量折叠到一个顶点(更准确地说,组合由循环中的边连接的任何2个顶点,直到用完这些边)。这将创建对应于块切割树的树(也在上面的链接中描述)。包含A的组件在新图中将为A,对于B也是如此。
3)由于结果图是一棵树,它只有从A到B的一条路径。用DFS找到它。该路径上的边缘是第2部分的答案。
4)(3)的边缘以及与这些边缘相邻的每个双连通分量的边缘都是第1部分的答案。
是的,听起来有点像@ EmmanuelAC的回答是试图指出这个方向。
答案 1 :(得分:0)
有一种算法可以找到“桥梁”,如果我们删除它,我们称桥为边缘,图形分为两个不相交的图形。你正在寻找的边缘是桥梁。 How can I find bridges in an undirected graph?
第1部分。既然你知道什么是桥梁,你只需要在这对节点之间找到一条路径,并且该路径中所有也是桥梁的顶点都是第1部分的解决方案。
第2部分。解决方案是图中的所有桥梁