有向图的基本定义:由一组顶点和一组有向边组成,每条有向边连接着有序的一对顶点。
import java.util.InputMismatchException; import java.util.NoSuchElementException; public class Digraph { private final int V; // number of vertices in this digraph private int E; // number of edges in this digraph private Bag<Integer>[] adj; // adj[v] = adjacency list for vertex v private int[] indegree; // indegree[v] = indegree of vertex v public Digraph(int V) { if (V < 0) throw new IllegalArgumentException("Number of vertices in a Digraph must be nonnegative"); this.V = V; this.E = 0; indegree = new int[V]; adj = (Bag<Integer>[]) new Bag[V]; for (int v = 0; v < V; v++) { adj[v] = new Bag<Integer>(); } } public int V() { return V; } public int E() { return E; } public void addEdge(int v, int w) { validateVertex(v); validateVertex(w); adj[v].add(w); indegree[w]++; E++; } public Iterable<Integer> adj(int v) { validateVertex(v); return adj[v]; } public int outdegree(int v) { validateVertex(v); return adj[v].size(); } public int indegree(int v) { validateVertex(v); return indegree[v]; } public Digraph reverse() { Digraph reverse = new Digraph(V); for (int v = 0; v < V; v++) { for (int w : adj(v)) { reverse.addEdge(w, v); } } return reverse; } }