2011-09-29 69 views
0

我正在閱讀一本書The Design and Analysis of Computer Algorithms通過閱讀Graph章節,我試圖實現DFS。通過閱讀該算法的定義它說,圖G=(V,E)E中的邊分成兩組TB。邊緣(v,w)是集T的地方,如果VERTES w尚未以前訪問過的,當我們在頂點v考慮小幅(v,w),否則邊`(V,W)是集B.地方C++中的圖形表示法

基本上他的DFS算法給我新的圖形將是G=(V,T)。我想知道如何在C++中實現這一點。

我試着用adjacency list,但我搞不清是否有必要存儲只是listmapedges應該沒事的。

回答

1

VTK中,邊緣存儲在vector中,並且它總是存儲一對(v,w)。在這個向量附近,還有另外兩個向量向量存儲圖形節點的邊緣和邊緣。當一個新的邊被添加時,它被添加到邊向量中,它的節點(v,w)也被添加到向量的向外和向外的邊向量中。

1

我不清楚你確切的問題是什麼。我假設你正在詢問如何維護兩個集合T和B,以區分已經被訪問的邊緣和不在DFS期間的邊緣。我認爲最簡單的方法是將一個bool字段「visited」添加到您的鄰接列表中的節點結構中。此字段對所有節點的初始值均爲「false」。假設在上述情況下,當DFS到達v並且沒有訪問邊緣(v,w)時,那麼對應於w的v列表上的節點對於那個時間的「被訪問」將具有值「假」 。否則,它將具有「真」的值。

我認爲作者只是試圖給你一個想法,即邊緣將被分爲兩類:訪問和DFS結束時未訪問。但我不認爲保持這兩種邊緣的明確集合是必要的。您始終可以根據其更新的「訪問」值在DFS之後打印訪問邊。