1. 程式人生 > >算法7-8:有向圖接口

算法7-8:有向圖接口

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:有向圖接口