2012-08-07 60 views
1

我在尋找檸檬來處理我的尋路,因爲它有搜索和最短路徑算法等等。檸檬圖庫C++ - 定向圖

事情是,我一開始就已經堅持瞭解檸檬如何工作,他們有一個教程,但沒有問題的論壇。

我對有向圖的理解是,你有一個節點,它可以鏈接或不鏈接到另一個節點,然後你有一個權重。

例子:

 A B C 
A 0 1 0 
B 1 0 5 
C 0 0 0 

在此,A連接到B重量爲1,C連接到什麼(所以一旦你C你被卡住),並B連接到A與1和B值連接到C與5

本教程的值表示做這樣的事情:

ListDigraph g; 
ListDigraph::Node A = g.addNode(); 
ListDigraph::Node B = g.addNode(); 
ListDigraph::Node C = g.addNode(); 

所以現在我有一個圖形g與三個節點。怎麼辦?我在哪裏/如何添加連接信息以及重量值?

回答

4

從檸檬教程

ListDigraph g; 

    ListDigraph::Node x = g.addNode(); 
    ListDigraph::Node y = g.addNode(); 
    ListDigraph::Node z = g.addNode(); 

    g.addArc(x,y); 
    g.addArc(y,z); 
    g.addArc(z,x); 

沒用過這個庫的頭腦,我只是引述我讀過。

+0

是啊,我看這個..和我的問題我中有你所編寫的代碼..但這個問題如何回答我的問題? – aJynks 2012-08-07 20:23:16

+1

您的第一個問題是「我如何添加連接信息」。在我的回答中,最後三行是,它不在你引用的代碼中。 – jahhaj 2012-08-07 20:25:44

+0

我也不知道這個庫。但是,您詢問如何將連接信息添加到圖表。看起來這個方法'addArc'就是這樣 - 除了沒有權重。 – 2012-08-07 20:26:47

0

LEMON使用的術語與大多數圖論文本略有不同,但在我看來,這使得使用庫更容易一些。

首先,邊緣和在LEMON電弧之間的差異僅僅是一個邊緣是兩個節點之間的無向邊緣,和電弧是定向邊緣。至於添加邊和權重以及什麼不是,圖本身只管理節點和邊/弧,與它們相關的唯一數據是一個整體標識符。

可以使用找到這個標識符:

graph.id(node); 

要附加數據塊到節點/邊,您使用的地圖。有幾種不同類型的地圖,但他們一般歸結爲NodeMapEdgeMap,或ArcMap - 而且,正如你可能猜到了,他們是<Node, V><Edge, V><Arc, V>給出,其中V是值類型關聯映射(它可以是任何具有默認構造函數的東西)。


要添加的邊緣(在無向圖中)或圓弧(在有向圖),則簡單地創建這兩個節點,然後使用.addEdge(n1, n2).addArc(n1, n2)

例如:

ListDigraph graph; 

ListDigraph::Node n1 = graph.addNode(); 
ListDigraph::Node n2 = graph.addNode(); 

ListDigraph::Arc a = graph.addArc(n1, n2); 

,並與該弧一定的價值關聯:

ArcMap<std::string> arcMap; 

arcMap[a] = "This is an arc value!";