找到重量的所有循环>特殊有向图中的0

时间:2016-02-15 18:58:47

标签: algorithm graph cycle

我正在寻找一种算法来查找所有边的总重量大于0的所有周期。我听说这个问题是NP完全的,但是因为我想解决这个特殊的图形总是看起来或多或少相同,我希望有一个更简单的方法。

我的图表如下所示:

在所有水平和垂直相邻顶点之间始终是n * n个顶点和边的正方形。只有两种可能的权重,黑色边缘为-1,绿色权重为+1。

对于这个例子,我正在寻找的周期是:

  • 7; 12; 17; 18; 19; 14; 13; 8; 7 =>重量:+1
  • 7; 12; 13; 8; 7 =>重量:+1
  • 7; 8; 7 =>重量:+2
  • 18; 23; 24; 19; 18 =>重量:+1
  • 7; 12; 17; 18; 23; 24; 19; 14; 13; 8; 7重量:=> 2

这项任务的有效算法是什么?它应该非常快,因为我也想对具有n = 25 => 625个顶点的图形执行此操作。

1 个答案:

答案 0 :(得分:1)

为什么不使用DFS进行基本循环检测并对其进行一些修改:

  • 当您遇到某个节点时,如果您已经访问过同一个节点,您就知道自己处于一个循环中,因此您要检查重量是否为正,如果是,请再次循环到把路径留在记忆中。
  • 如果您已经看过您正在访问的节点,请停在这里。
  • 然后递归访问节点的邻居。

伪代码可能如下所示:

dfs(node, weight):
     if state[node] is "in progress" AND weight > 0
         // This is a cycle we want
         Keep in memory the path (just go throught the cycle once more)
     if state[node] is "visited"
         Stop

     state[node] = "in progress"
     For each neighbour
         dfs(neighbour, weight + edge_weight)
     state[node] = "visited"

如果你为每个起始节点做到这一点,你应该得到大约O(N * M)的时间复杂度,其中N是顶点数,M是边数。

希望这有帮助!

编辑:忘了更新状态