【发布时间】:2010-12-15 02:02:52
【问题描述】:
我正在研究修改后的 TopSort 算法,但无法找到/创建用于测试的大型(超过 1000 个节点)有向无环图。我有一个来自另一个项目的无向样本图,它的规模很大,但有很多周期。有没有一种算法可以用来引导边缘,从而不再有循环?
【问题讨论】:
标签: graph
我正在研究修改后的 TopSort 算法,但无法找到/创建用于测试的大型(超过 1000 个节点)有向无环图。我有一个来自另一个项目的无向样本图,它的规模很大,但有很多周期。有没有一种算法可以用来引导边缘,从而不再有循环?
【问题讨论】:
标签: graph
this 提供了一种获取非循环图的方法。基本上,图遍历会产生一棵树,它定义了原始节点上的偏序。然后,只需引导所有边,使它们要么根据偏序指向一致的方向,要么位于 2 个无序的元素之间(它们可以指向任何方向)。
【讨论】:
为了保证新的有向图是连接的,我会使用如下的 beadth-first 搜索。
old_undirected graph G
new_directed graph D
dequeue Q
v is any node in G
add v to D
Q.push_back(v)
while(Q is not empty):
v = Q.pop_front()
for all neighbors u to v:
if u in D
add edge u->v to D
else
add u to D and add edge v->u to D
Q.push_back(u)
return D
这个图应该包含原始图的所有边,但应该有方向,不会有任何圆圈。
【讨论】:
您希望将图形转换为有根树的森林。对图的每个组件进行广度优先或深度优先的图遍历。在遍历的过程中,在父子顶点之间做一条有向边。
【讨论】: