我正在寻找一种算法来查找所有边的总重量大于0的所有周期。我听说这个问题是NP完全的,但是因为我想解决这个特殊的图形总是看起来或多或少相同,我希望有一个更简单的方法。
我的图表如下所示:
在所有水平和垂直相邻顶点之间始终是n * n
个顶点和边的正方形。只有两种可能的权重,黑色边缘为-1,绿色权重为+1。
对于这个例子,我正在寻找的周期是:
这项任务的有效算法是什么?它应该非常快,因为我也想对具有n = 25 => 625
个顶点的图形执行此操作。
答案 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是边数。
希望这有帮助!
编辑:忘了更新状态