问题描述
是否有任何算法实现在 Golang 中找到具有自边的有向多重图中的所有循环?我发现 Johnson's algo 是有向图的最佳解决方案,gonum 中给出了实现,但它仅适用于有向图(不是多重图),并且不支持自边(实际上是有向图在 gonum 中不支持自边缘)。我可以在 gonum 中做任何简短/聪明的 hack 来使 johnson 对具有自边的有向多重图进行工作吗?或者在 Golang 中还有其他实现吗?
可以做的一件事是在自边和同一对节点之间的重复边之间创建一个虚拟节点。这将删除所有自边,图形将是有向边,我可以在这里使用 Johnson's。但是有没有更好的方法?
解决方法
-
self edge :你只需要扫描图形的每个节点并检查是否有自边。如果有:将
X -> X
添加到循环列表 多图:第一个算法将生成路径作为顶点序列
X1 -> X2 -> X3 -> ...
。当你有这个列表时,迭代所有可能的边从X1
到X2
,然后所有可能的边从X2
到X3
,等等......
- “聪明”技巧:从您的多重图
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
上运行循环枚举,并根据需要调整输出。