2012-11-19 29 views
7

我不能使用任何外部庫,所以我想着想自己構建數據結構的一些方法。我想也許這樣的事情:有什麼方法可以表示Java中的加權有向圖?

public class Node{ 
    Set<Edge> adjacent; 
    int value; 
} 

public class Edge{ 
    Node target; 
    int weight; 
} 

但我猜測可能有更好的方法來做到這一點。

我最終使用這個圖表是運行貝爾曼福特算法,但我顯然首先需要一個功能圖!

回答

10

答案很大程度上取決於您計劃應用於圖表的算法。

有兩種常見的方法來表示圖 - adjacency listadjacency matrix。在你的情況下,鄰接矩陣是一個表示權重的整數的正方形數組。您的表示使用鄰接列表。

有一些算法在鄰接矩陣上運行得更好(例如Floyd-Warshall算法)。其他算法在鄰接列表上工作得更好(例如Dijkstra算法)。如果你的圖很稀疏,那麼使用鄰接矩陣可能會令人望而卻步。

+0

通過工作更好,你只是表示他們更有效率? – Hoser

+1

@Hoser在大多數情況下,答案是「是」。 Floyd-Warshall等特殊情況需要矩陣才能工作。您可以保持鄰接列表的表示形式,直到運行算法,構建矩陣運行它,最後將矩陣轉換回鄰接列表。 – dasblinkenlight

+0

好的,謝謝。這兩者中的哪一個讓他們支持方向?他們是否真的實施了方向,還是我必須管理自己? – Hoser

2

像往常一樣,您可以將圖表表示爲鄰接表或鄰接矩陣。這個選擇實際上取決於你的問題的細節。

使用鄰接矩陣,您可以簡單地有一個整數矩陣,表示權重。

如果您決定設置一個鄰接列表,您可以簡單地存儲一個整數列表 (假設圖的節點由一個整數值標識),類似於您所做的。

+0

是否鄰接矩陣支撐邊緣權重? – Hoser

+1

是的,我糾正了答案。你可以在矩陣上有權重(X行,COL Y有VAL Z,意味着從X到Y的成本是Z) – leo

+0

好的,謝謝。鄰接矩陣似乎是一個很好的方法來做到這一點。它如何支持方向要求?鄰接矩陣是否有任何特定的原因迫使您在節點之間以某種方式走,或者它只是我需要確保避免的東西。 – Hoser

0

可以在一個未加權的曲線圖使用一個節點作爲,保持節點的列表,以其所連接,並且另外添加與所述連接相關聯的權重:

public class Node{ 
    int value; 
    HashMap<Node,Integer> adjacency; 
} 
相關問題