图的表示

图的表示(图的存储):

  • 邻接矩阵(Adjacency Matrix)
  • 邻接表(Adjacency Lists)

邻接矩阵

邻接矩阵适合表示稠密图 (Dense Graph)

稠密图:边比较多的图

稠密图--邻接矩阵的实现

public class DenseGraph {

    private int n; //节点数
    private int m; // 边数
    private boolean directed; // 是否为有向图
    private boolean[][] g;  // 图的具体数据

    // 构造函数
    public DenseGraph(int n, boolean direction) {
        assert n >= 0;
        this.n = n;
        this.m = 0;
        this.directed = direction;
        // g初始化为n*n的不二矩阵,每一个g[i][j]均为false,表示没有任何边
        // 默认为false
        g = new boolean[n][n];
    }

    // 返回节点个数
    public int V() {
        return this.n;
    }
    // 返回边的个数
    public int E() {
        return this.m;
    }
    // 向图中添加一个边
    public void addEdge(int v, int w) {
        assert v >= 0 && v < n;
        assert w >= 0 && w < n;
        if (hasEdge(v,w)) {
            return;
        }
        g[v][w] = true;
        if (!directed) {
            g[w][v] = true;
        }
        m++;
    }
    // 验证图中是否有从v到w的边
    boolean hasEdge(int v, int w) {
        assert v >= 0 && v < n;
        assert w >= 0 && w < n;
        return g[v][w];
    }
}

邻接表

邻接表适合表示稀疏图 (Sparse Graph)

稀疏图:边比较少的图

稀疏图--邻接表的实现

public class SparseGraph {
    private int n;  // 节点数
    private int m;  // 边数
    private boolean directed;  //是否为有向图
    private Vector<Integer>[] g; // 图的具体数据
    // 构造函数
    public SparseGraph(int n, boolean directed) {
        assert n >= 0;
        this.n = n;
        this.m = 0;    // 初始化没有任何边
        this.directed = directed;
        // g初始化为n个空的vector,表示每一个g[i]都为空,即没有任何边
        g = new Vector[n];
        for (int i = 0; i < n; i++) {
            g[i] = new Vector<Integer>();
        }
    }
    // 返回节点个数
    public int V() {
        return n;
    }
    // 返回边的个数
    public int E() {
        return m;
    }
    // 向图中添加一个边
    public void addEdge(int v, int w) {
        assert v >= 0 && v < n;
        assert w >= 0 && w < n;

        g[v].add(w);
        if (v != w && !directed) {
            g[w].add(v);
        }
        m ++;
    }
    // 验证图中是否有从v到w的边
    boolean hasEdge(int v, int w) {
        assert v >= 0 && v < n;
        assert w >= 0 && w < n;

        for (int i = 0; i < g[v].size(); i++) {
            if (g[v].elementAt(i) == w) {
                return true;
            }
        }
        return false;
    }
}

results matching ""

    No results matching ""