我有一个沿着边缘流量的有向图,我想通过删除所有循环流来简化它。这可以通过在任何给定循环中找到沿每个边缘的流量的最小值并且将循环中每个边缘的流量减小该最小量来完成,删除具有零流量的边缘。当所有循环流被移除后,图形将是非循环的。
例如,如果我有一个带有顶点A,B和C的图形,其中A→B的流量为1,B→C的流量为2,C→A的流量为3,那么我可以重写此流量而没有来自A→B的流量,1来自B→C,2来自C→A。图表中的边数从3减少到2,结果图是非循环的。
哪种算法(如果有的话)可以解决这个问题?
答案 0 :(得分:3)
您可能会发现使用流分解定理(参见this discussion of max-flow的第6.2节)很有用,它说任何流都可以分解为一组流路径和流周期。此外,图中总共可以有m个总流量路径和周期。这意味着消除流动循环的一个简单算法是找到图中的所有流路径,然后移除图中的所有剩余流,因为它必须对应于流循环。
要查找流路径或循环,可以使用源节点中的简单深度优先搜索。从源节点开始,按照您的要求保留以下边缘,直到您点击终端节点或访问您之前访问过的节点。如果您点击终端节点,那么您所采用的路径就是一个简单的流路径。如果您遇到一些节点两次,您刚刚找到了一个流程周期(由您刚刚找到的循环形成)。如果然后从图形中删除流路/循环并重复,则最终将检测所有流路径和循环。你知道当没有流动边缘离开源代码时你已经完成了。如果每次找到流路径时都记录其所有边缘的总流量,则可以通过重复此操作来消除循环流,直到没有剩余流路径,清除网络中的流量,然后在流路径中添加回来。 / p>
由于每个DFS需要时间O(m + n)且最多有O(m)个流路径,因此该步骤的总运行时间为O(m 2 + mn),这是图中大小的多项式。
希望这有帮助!
答案 1 :(得分:2)
您可以计算给定流量的值V
,然后解决给定网络的最小成本流量问题和流量值V
,为每个边缘分配成本1
。
然后产生的流量不应包含任何周期,因为这将是非最优的(就成本而言)。
答案 2 :(得分:1)
您可以使用拓扑排序 http://en.wikipedia.org/wiki/Topological_sorting
在有向图中找到循环时效果很好
答案 3 :(得分:0)
您是否考虑过制作minimum spanning tree?您可以使用Dijkstra's algorithm。如果您想首先查看图表是否是循环的,您可以使用topological sorting确定。