2012-03-25 113 views
1

确实只需要一些指导: 通过圆弧定义的拓扑排序(从我的问题) - 是对方向图中的所有圆弧进行排序的一种方式,因此插入到顶点的所有圆弧必须先于从这个顶点出来。通过圆弧进行拓扑排序

回答

3

无需在拓扑排序中改变任何东西,你可以使用它和后期处理。

高电平伪代码:

  1. 运行拓扑排序,让所得到的数组是arr
  2. 创建空边缘列表中,让它成为l
  3. arr [有序迭代]
  4. 为每个顶点v
    3.1。对于每个(v,u) in E
    3.1.1。追加(v,u) to l
  5. 回报l

这种方法的好处是,你可以使用拓扑排序为黑盒,而无需修改它,只是后期处理,以获得所需的结果。

正确性 [证明的草图]:
由于每个边缘(v,u) - u显示在拓扑排序v后,在打印它,它是通过v完成,并且因此(v,u)打印任何顶点之前被印刷附于u

复杂
O(|V|+|E|)拓扑排序,O(|V|+|E|)用于后处理[迭代的所有顶点和所有边缘。

+0

是的,大O是一样的,但你必须做两倍的工作量... – tchap 2012-03-25 22:38:17

+0

@OndrejKupka:的确,常数会高于修改拓扑排序[虽然不是双倍,我相信由于缓存性能],但为了**封装**拓扑排序的好处。 [这是非常重要的方面!]。在实际应用中,*如果您发现这部分是热点*,您可能会想要重写它,并表示同意。 – amit 2012-03-25 22:49:05

+0

是的,把这么多的代码拷贝一空并不实际。 – tchap 2012-03-25 22:57:19

0

“传统”拓扑排序是对顶点进行排序,而这是对弧进行排序。否则,原理是一样的...

+0

,但我知道,当我在拓扑排序算法看我不understart它如何为圆弧改变...... 不想让你去解决它为我,但我需要一些指导,请 – Nusha 2012-03-25 22:01:01

+0

前往维基您通过的页面,操作码部分。删除'将n插入到L'中,并在步骤中说'从图中删除边e'也可以'将边e插入到L'中。这样你将会记住弧而不是顶点。 – tchap 2012-03-25 22:08:29