在具有自边的有向多重图中查找所有循环

问题描述

是否有任何算法实现在 Golang 中找到具有自边的有向多重图中的所有循环?我发现 Johnson's algo 是有向图的最佳解决方案,gonum 中给出了实现,但它仅适用于有向图(不是多重图),并且不支持自边(实际上是有向图在 gonum 中不支持自边缘)。我可以在 gonum 中做任何简短/聪明的 hack 来使 johnson 对具有自边的有向多重图进行工作吗?或者在 Golang 中还有其他实现吗?

可以做的一件事是在自边和同一对节点之间的重复边之间创建一个虚拟节点。这将删除所有自边,图形将是有向边,我可以在这里使用 Johnson's。但是有没有更好的方法?

解决方法

  • self edge :你只需要扫描图形的每个节点并检查是否有自边。如果有:将 X -> X 添加到循环列表

  • 多图:第一个算法将生成路径作为顶点序列X1 -> X2 -> X3 -> ...。当你有这个列表时,迭代所有可能的边从 X1X2,然后所有可能的边从 X2X3,等等......


  • “聪明”技巧:从您的多重图 G 创建一个新图 G2,其中 G也显示为顶点:立>
# if A and B are connected     # create the following 3 vertices and
# by a single edge in G :      # 2 edges in G2 :

   A ---w--> B                     A -> w -> B


# if A and B are connected     # create the following 4 vertices and
# by two edges in G :          # 4 edges in G2 :

     /--x--\                           /-> x --\
    A       B                        A          B
     \--y--/                           \-> y --/

# etc ...

然后在 G2 上运行循环枚举,并根据需要调整输出。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...