如何解决从给定的边缘构建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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。