圖的定義:由一組頂點和一組能夠將兩個頂點相連的邊組成的數據結構.
圖的常用表示方法
鄰接矩陣:使用矩陣表示,當頂點v和w連接在一起時,就把v行w列定義為true,否則為false,但大量數據時所需空間不能滿足.
邊的數組:使用一個Edge類,含有兩個變量,對應邊上的頂點.
鄰接表數組:以頂點為索引的列表數組,數組中的每個元素都是和該頂點鄰接的頂點.

連通圖:從任意一個頂點都存在一條路徑到達另一個任意頂點,如果一個非連通圖由若干連通的部分組成,它們都是極大連通子圖.
圖的密度是指已經連接的頂點對所占所有可能連接的頂點對的比例.在稀疏圖中,被連接的頂點對很少,而在稠密圖中,只有少部分頂點對之間沒有邊連接.
二分圖是一種能夠將所有節點分為兩部分的圖,其中圖的每條邊所連接的兩個頂點都分別屬於不同的部分.

利用深度優先搜索尋找路徑
public class DepthFirstPaths { private boolean[] marked; //是否調用過dfs private int[] edgeTo; //從起點到一個頂點已知路徑上的最后一個頂點 private final int s; //起點 public DepthFirstPaths(Graph G,int s){ marked = new boolean[G.V()]; edgeTo = new int[G.V()]; this.s = s; dfs(G,s); } public void dfs(Graph G, int v){ marked[v] = true; //標記為已調用 for(int w:G.adj(v)){ //遍歷該頂點所有鄰接點 if(!marked[w]){ edgeTo[w] = v; //最后到達w的頂點 dfs(G,w); } } } public boolean hasPathTo(int v){ return marked[v]; } //遍歷從出發點s到頂點v的路徑 public Iterable<Integer> pathTo(int v){ if(!hasPathTo(v)) return null; Stack<Integer> path = new Stack<Integer>(); for(int x = v; x != s; x=edgeTo[x]){ path.push(x); } path.push(s); return path; } public static void main(String[] args) { // TODO Auto-generated method stub } }
利用廣度優先搜索尋找路徑
public class BreadthFirstPaths { private boolean[] marked; private int[] edgeTo; private final int s; public BreadthFirstPaths(Graph G, int s){ marked = new boolean[G.V()]; edgeTo = new int[G.V()]; this.s = s; bfs(G,s); } private void bfs(Graph G,int s){ Queue<Integer> queue = new Queue<Integer>(); marked[s] = true; //起點存入隊列 queue.enqueue(s); while(!queue.isEmpty()){ //刪除頂點 int v = queue.dequeue(); for(int w:G.adj(v)){ if(!marked[w]){ edgeTo[w] = v; marked[w] = true; queue.enqueue(w); } } } } public static void main(String[] args) { // TODO Auto-generated method stub } }
