算法7-8:有向圖接口
阿新 • • 發佈:2017-05-13
port rabl his lis ava log 相同 top max
有向圖和無向圖在編程中的表示方法是差點兒相同的,本問介紹鄰接表表示方法。
有向圖對象的代碼輪廓例如以下:
public class Digraph { public Digraph(int v) { } // 創建v到w的邊 public void addEdge(int v, int w) { } // 獲取v能直接到達的頂點 public Iterable<Integer> adj(int v){ } // 獲取整張圖的頂點數量 public int V() { } // 獲取整張圖的邊數 public int E() { } // 將整整圖的方向反轉 public Digraph reverse() { } @Override public String toString() { } }
代碼
這次用鄰接表方法進行實現,代碼和無向圖是差點兒相同的。
import java.util.LinkedList; import java.util.List; public class Digraph { private List<Integer>[] adj; private int v; public Digraph(int v) { adj = (List<Integer>[]) new LinkedList[v]; this.v = v; } // 創建v到w的邊 public void addEdge(int v, int w) { adj[v].add(w); } // 獲取v能直接到達的頂點 public Iterable<Integer> adj(int v) { return adj[v]; } // 獲取整張圖的頂點數量 public int V() { return v; } // 獲取整張圖的邊數 public int E() { int result = 0; for (List<Integer> e : adj) { result += e.size(); } return result; } // 將整整圖的方向反轉 public Digraph reverse() { Digraph G = new Digraph(this.v); for (int v = 0; v < this.v; v++) { for (int w : adj(v)) { G.addEdge(w, v); } } return G; } @Override public String toString() { String result = ""; for (int v = 0; v < this.v; v++) { result += v + ":"; for (int w : adj(v)) { result += " " + w; } result += "\n"; } return result; } }
算法7-8:有向圖接口