我不能使用任何外部庫,所以我想着想自己構建數據結構的一些方法。我想也許這樣的事情:有什麼方法可以表示Java中的加權有向圖?
public class Node{
Set<Edge> adjacent;
int value;
}
public class Edge{
Node target;
int weight;
}
但我猜測可能有更好的方法來做到這一點。
我最終使用這個圖表是運行貝爾曼福特算法,但我顯然首先需要一個功能圖!
我不能使用任何外部庫,所以我想着想自己構建數據結構的一些方法。我想也許這樣的事情:有什麼方法可以表示Java中的加權有向圖?
public class Node{
Set<Edge> adjacent;
int value;
}
public class Edge{
Node target;
int weight;
}
但我猜測可能有更好的方法來做到這一點。
我最終使用這個圖表是運行貝爾曼福特算法,但我顯然首先需要一個功能圖!
答案很大程度上取決於您計劃應用於圖表的算法。
有兩種常見的方法來表示圖 - adjacency list和adjacency matrix。在你的情況下,鄰接矩陣是一個表示權重的整數的正方形數組。您的表示使用鄰接列表。
有一些算法在鄰接矩陣上運行得更好(例如Floyd-Warshall算法)。其他算法在鄰接列表上工作得更好(例如Dijkstra算法)。如果你的圖很稀疏,那麼使用鄰接矩陣可能會令人望而卻步。
像往常一樣,您可以將圖表表示爲鄰接表或鄰接矩陣。這個選擇實際上取決於你的問題的細節。
使用鄰接矩陣,您可以簡單地有一個整數矩陣,表示權重。
如果您決定設置一個鄰接列表,您可以簡單地存儲一個整數列表 (假設圖的節點由一個整數值標識),類似於您所做的。
可以在一個未加權的曲線圖使用一個節點作爲,保持節點的列表,以其所連接,並且另外添加與所述連接相關聯的權重:
public class Node{
int value;
HashMap<Node,Integer> adjacency;
}
通過工作更好,你只是表示他們更有效率? – Hoser
@Hoser在大多數情況下,答案是「是」。 Floyd-Warshall等特殊情況需要矩陣才能工作。您可以保持鄰接列表的表示形式,直到運行算法,構建矩陣運行它,最後將矩陣轉換回鄰接列表。 – dasblinkenlight
好的,謝謝。這兩者中的哪一個讓他們支持方向?他們是否真的實施了方向,還是我必須管理自己? – Hoser