我有一个有向循环图。其中一些边是固定的,不能被移除。其他边可以被移除以打破循环。
在这个图中,最好的方法是什么来移除循环呢? 遍历应该尽量使用深度优先搜索,并从给定节点开始。
在这个图中,最好的方法是什么来移除循环呢? 遍历应该尽量使用深度优先搜索,并从给定节点开始。
问题并没有充分说明,因为您没有指定例如图形是否需要保持连接,或者是否要删除“少量”非固定边以打破所有循环,或者是否真正需要全局最小数量的非固定边被删除。
如果图形不需要保持连接,只需遍历所有边缘并删除所有非固定边。这将删除所有可以在不删除固定边缘的情况下删除的循环。
如果您想要一个简单的贪婪算法来删除边缘,那么可以使用纯DFS,只要在删除一些非固定边缘时图形仍然保持连接:
proc recurse(vertex n, vertex_set ns)
if (n appers_in ns) // it is a cycle
return BREAK_CYCLE
else for (e in list_outgoing_edges_from(n))
np = e.destination
result = recurse(np, add_to_set(ns, np))
if (result == BREAK_CYCLE)
if (e.FIXED)
return BREAK_CYCLE
else
[remove e from the graph]
return RETRY
else if (result == RETRY)
return recurse(n, ns)
return FINISHED
if (recurse (your_initial_node, empty_vertex_set()))
[graph contains a cycle through only FIXED edges]
else
[the reachable component from initial_node has no longer cycles]