用路径而不是边上的感应计算感应子图

问题描述

考虑一个简单的有向图G =(V,E)。一个简单的有向图既不包含自环也不包含多个边。让我们进一步假设G由单个(弱连接的)组件组成。

给定V的子集V',我想创建另一个简单的有向图G'=(V',E'),以便当且仅当存在路径时,G'才具有边(u,v) G中从u到v的任何路径(不一定是最短路径)(在V'中不包含任何其他顶点)。显然,G'并不是G的一个子图,但是问题似乎很相似。它是否有标准解决方案,还是我必须自己推出?

一个具体的例子可以使我更加清楚:给定一个仅由专用网关,并行网关,任务以及它们之间的顺序流组成的BPMN图,我想将此图简化为原始控制流。也就是说,我想执行所有任务,以便我的V'仅由网关组成。然后,我想连接任何两个在原始图中仅在其中通过任务而不通过其他网关的路径之间的网关。这样的路径(如果存在)可能不是原始图中两个网关之间的唯一路径,也不是最短路径。如果存在多个这样的路径(通常就是这种情况,因为打开网关的每个分支通常会通过多个任务将其引导到同一个关闭网关),那么我当然希望我的简化图在这些网关之间仅包含一个边缘。

解决方法

我会这样做:

  1. 进行(V - V',E)中的transitive closure。我们称之为(V - V',Et)
  2. 当且仅当(u,v)中存在G'(ui,vi)的中间边缘Et时,(u,ui)中的边(vi,v)边缘在E中。

步骤1的复杂度为O(|V - V'|**3),步骤2的复杂度为O(|V'|**2)

我还感觉到Floyd–Warshall algorithm的传递闭包可以修改为一步完成。在dist(距离或路径存在矩阵)中,它将需要一个额外的数据字段:“从V开始”,“以V结尾”,并且应从中间路径中排除V

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...