从给定的边缘构建DAG

问题描述

| 让我们来看看具有N个顶点且没有边的图。 让我们有边列表:
x1 y1
x2 y2
x3 y3
.
.
.
xk yk
我们必须处理从1到k的所有边。 我们将不得不说第x个边是否在图中进行循环。如果不是,请将其添加到图形中。 如何有效地做这样的事情?我的意思是不要每次都用DFS检查第x个边缘是否在制作循环图。 有更快的东西吗? 这是波兰语的SPOJ问题
https://pl.spoj.pl/problems/XIWTPZF/
谢谢你的帮助。 克里斯     

解决方法

        创建一个边缘对象。在边缘对象中,您有两个标志。跟踪标志和添加的标志。 从要检查的边缘列表中构建对象模型。添加所有边,并使用边对象中的指针连接链接的边。将边缘添加到模型时,请链接到新添加的边缘,并将所有先前添加的边缘终止于新添加的边缘的起点。 测试边缘时,请先临时设置其添加标志。然后以递归方式进行跟踪,并随即设置跟踪标志。如果您在已经跟踪的边缘上发生碰撞,请返回false,并在出路时清除跟踪标志。重要的是,您不要跟踪未设置添加标志的边。 如果不发生碰撞,则对终止的每个边都返回true,而不会触及跟踪标志。 如果返回true,则移至有序列表中的下一个边缘。如果返回false,则清除添加的标志。 在跟踪结束时,检查添加的标志。 在此位置严重伪造了代码(因此请不要更正我的C ++语法):http://pastebin.com/dT2bFmqp     ,        一般来说,我不确定执行此操作的有效方法。我认为您可以通过将图形划分为不相交的集合来获得一些效率,但这实际上取决于特定输入图的布局,这将为您带来多少收益。此外,您可以采用其他一些快捷方式(例如检查要连接的边上是否有任何边),但这又取决于特定图形的属性,以决定它是否对您有很大帮助。 这是我想出的算法,可能效率不如您所愿:
# No cycles on an empty list
for edge in edgeList:
    graph.addEdge(edge)
    cycles = detectCycle(graph)
    if cycles
        graph.removeEdge(edge)