Graph 从给定边构建DAG

Graph 从给定边构建DAG,graph,Graph,让我们有一个有N个没有边的垂直线的图 让我们来看看边的列表: x1 y1 x2 y2 x3 y3 . . . xk yk 我们必须处理从1到k的所有边。 我们必须说,第x条边是否在图中形成循环。如果不是,则将其添加到图表中 如何有效地做这样的事情?我的意思是,如果第x条边每次都在生成循环图,那么就不要与DFS进行检查 有更快的吗? 这是波兰人的问题 https://pl.spoj.pl/problems/XIWTPZF/ 谢谢你的帮助。 克里斯总的来说,我不确定这样做是否有效。我认为,通过将

让我们有一个有N个没有边的垂直线的图

让我们来看看边的列表:

x1 y1
x2 y2
x3 y3
.
.
.
xk yk
我们必须处理从1到k的所有边。 我们必须说,第x条边是否在图中形成循环。如果不是,则将其添加到图表中

如何有效地做这样的事情?我的意思是,如果第x条边每次都在生成循环图,那么就不要与DFS进行检查

有更快的吗? 这是波兰人的问题

https://pl.spoj.pl/problems/XIWTPZF/
谢谢你的帮助。
克里斯

总的来说,我不确定这样做是否有效。我认为,通过将图形划分为不相交的集合,可以获得一些效率,但这实际上取决于特定输入图形的布局,取决于这将为您带来多少好处。此外,您还可以使用其他一些快捷方式(例如检查连接到的边上是否有任何边),但这同样取决于特定图形的属性,取决于它是否对您有很大帮助

下面是我提出的算法,它可能没有您希望的那么有效:

# No cycles on an empty list
for edge in edgeList:
    graph.addEdge(edge)
    cycles = detectCycle(graph)
    if cycles
        graph.removeEdge(edge)

创建边对象。在边缘对象中有两个标志。跟踪标志和添加的标志。 从要检查的边列表中构建对象模型。添加所有边,并连接使用边对象中的指针链接的边。将边添加到模型时,将所有以前添加的边链接到新添加的边,这些边在新添加的边的起点处结束

测试边时,首先临时设置它的“添加”标志。然后进行递归跟踪,在执行时设置跟踪标志。如果碰撞到已跟踪的边,则返回false,并在退出时清除跟踪标志。重要的一点是,不要跟踪未设置添加标志的边

如果未碰撞,则对于终止而未命中跟踪标志的每条边,都将返回true

如果返回true,则移动到有序列表中的下一条边。如果返回false,请清除添加的标志

在跟踪结束时,检查添加的标志


严重的pSeEDO代码在这个位置(所以不要纠正我的C++语法):

这节省了一些时间,通过消除实际的添加和删除对象模型的边缘效率,这将需要解耦和删除对象。还允许您拥有订单检查列表以及对象模型,因此当您在最后进行测试时,您只需在订单检查列表中循环。此时,您可以删除未添加的项目,并获得最终列表。如果您在检测阶段使用一个接口,在使用阶段使用一个单独的接口,那么您不必在使用阶段保留更大的接口。