Java中的圖是一種非常重要的數據結構,在很多應用中都有廣泛的應用。圖的遍歷和分類是圖研究中的核心內容。
圖遍歷是指在圖中按照一定的方式訪問每個節點,使得每個節點都被訪問且僅被訪問一次。Java中的圖遍歷算法主要有深度優先遍歷和廣度優先遍歷兩種。
/** * 深度優先遍歷算法 * @param G 待遍歷的圖 * @param v 起始節點 */ public void dfs(Graph G, int v){ visited[v] = true; for(int w : G.adj(v)){ if(!visited[w]){ dfs(G, w); } } } /** * 廣度優先遍歷算法 * @param G 待遍歷的圖 * @param v 起始節點 */ public void bfs(Graph G, int v){ Queuequeue = new LinkedList (); visited[v] = true; queue.add(v); while(!queue.isEmpty()){ int w = queue.poll(); for(int x : G.adj(w)){ if(!visited[x]){ visited[x] = true; queue.add(x); } } } }
圖的分類是指對于不同的圖按照其特征進行分類。Java中的圖分類算法主要有無向圖和有向圖兩種分類方法。
/** * 判斷某個圖是否是無向圖 * @param G 待判斷的圖 * @return true則是,false則不是 */ public boolean isUndirected(Graph G){ for(int v = 0; v< G.V(); v++){ for(int w : G.adj(v)){ if(!G.adj(w).contains(v)){ return false; } } } return true; } /** * 判斷某個圖是否是有向圖 * @param G 待判斷的圖 * @return true則是,false則不是 */ public boolean isDirected(Graph G){ for(int v = 0; v< G.V(); v++){ for(int w : G.adj(v)){ if(G.adj(w).contains(v)){ return false; } } } return true; }
總之,Java中圖的遍歷和分類算法處理圖的各種場景下的問題非常重要。