Graph.java

package cn.denghanxi.s41;

import edu.princeton.cs.algs4.Bag;
import edu.princeton.cs.algs4.In;

/**
 * 图的简单实现,所有参数都没有做验证
 */
public class Graph {
    private final int V; //定点数目
    private int E; //边的数目
    private Bag<Integer>[] adj; //邻接表

    public Graph(int v) {
        this.V = v;
        this.E = 0;
        adj = (Bag<Integer>[]) new Bag[v];
        for (int i = 0; i < v; i++)
            adj[i] = new Bag<>();
    }

    public Graph(In in) {
        this(in.readInt());
        int E = in.readInt();
        for (int i = 0; i < E; i++) {
            int v = in.readInt();
            int w = in.readInt();
            addEdge(v, w);
        }
    }

    public int V() {return V;} //获取顶点数
    public int E() {return E;} //获取边数

    /**
     * 添加一条边
     * @param v 边的一个顶点
     * @param w 边的另一个顶点
     */
    public void addEdge(int v, int w) {
        adj[v].add(w);
        adj[w].add(v);
        E++;
    }

    /**
     * 获取某个顶点的相邻顶点集合
     * @param v 顶点
     * @return 相邻集合
     */
    public Iterable<Integer> adj(int v) {
        return adj[v];
    }
}