大家好,
是否有任何通用算法将非DAG(有向无环图)作为输入并输出有向非循环图。
目前,我不确定将使用哪些数据结构来表示我的图表。但是,我现在正在搜索算法。
希望你们能就此事通知我。
干杯〜
答案 0 :(得分:1)
您总是可以简单地翻转一些边以从循环图中获得非循环图(具有顶点V和边E的图G):
input: G(V,E), n = |V|
visited <- empty set
queue <- empty queue
for each node in V
// skip visited nodes
if visited.find(node)
continue
// push a dummy edge (node is unvisited)
queue.push(edge(inf, node))
while !queue.empty()
edge <- queue.pop()
if visited.find(edge.stop)
// potential cycle detected
if edge.start != edge.stop
// eliminate loops, if any
E.flip(edge)
else
visited.insert(edge.stop)
for each outgoing edge e at edge.stop
queue.push(e)
根据您使用的队列,您会得到不同的行为:
上面的代码中有一个空洞:检测到潜在的循环。想象一下顶点为A, B, C
和边A->B, A->C, C->B
的图形。上述代码段会在最后处理C->B
时检测到潜在的循环。如果您想消除在此时引入周期的边缘的有效边消除歧义,则需要显示还没有从B
到C
的路径。这是一项艰巨的任务,this answer here中有一些好的答案(和提示):基本上你需要执行另一个图遍历来检测(或排除)这种冲突的路径。