2012-03-25 78 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