FlowNetWork.java

package cn.denghanxi.s604;

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

/**
 * 流量网络
 */
public class FlowNetWork {

    private int v;
    private int e;
    private Bag<FlowEdge>[] adj; //邻接表

    @SuppressWarnings("unchecked")
    public FlowNetWork(int v) {
        this.v = v;
        this.adj = (Bag<FlowEdge>[]) (new Bag[v]);
        for (int i = 0; i < v; i++) {
            this.adj[i] = new Bag<>();
        }
    }

    @SuppressWarnings("unchecked")
    public FlowNetWork(In in) {
        this.v = in.readInt();
        this.adj = (Bag<FlowEdge>[]) (new Bag[v]);
        for (int i = 0; i < v; i++) {
            this.adj[i] = new Bag<>();
        }
        int edgeNum = in.readInt();
        for (int i = 0; i < edgeNum; i++) {
            FlowEdge edge = new FlowEdge(in.readInt(), in.readInt(), in.readDouble());
            addEdge(edge);
        }
    }

    public int v() {
        return v;
    }

    public int e() {
        return e;
    }

    public void addEdge(FlowEdge edge) {
        Bag<FlowEdge> bag = adj[edge.from()];
        bag.add(edge);
        e++;
    }

    public Iterable<FlowEdge> adj(int v) {
        return adj[v];
    }

    public Iterable<FlowEdge> edges() {
        Bag<FlowEdge> result = new Bag<>();
        for (Bag<FlowEdge> flowEdges : adj) {
            for (FlowEdge edge : flowEdges) {
                result.add(edge);
            }
        }
        return result;
    }

    public static FlowNetWork tinyFN() {
        return new FlowNetWork(new In(FlowNetWork.class.getResource("/tinyFN.txt")));
    }
}