// Path: src/main/java/io/github/marioluan/datastructures/graph/Digraph.java
// public class Digraph implements Graph {
//     private final int V;
//     private int E;
//     private Bag<Integer>[] adj;
// 
//     /**
//      * Creates an empty {@link Digraph}.<br>
//      * time complexity: O(V)
//      *
//      * @param V number of vertices
//      */
//     public Digraph(int V) {
//         this.V = V;
//         adj = (Bag<Integer>[]) new Bag[V];
//         IntStream.range(0, V).forEach(v -> adj[v] = new Bag<>());
//         E = 0;
//     }
// 
//     // time complexity: O(1)
//     @Override
//     public void addEdge(int v, int w) {
//         adj[v].add(w);
//         E++;
//     }
// 
//     // time complexity: outdegree(v)
//     @Override
//     public Iterable<Integer> adj(int v) {
//         return adj[v];
//     }
// 
//     // time complexity: O(1)
//     @Override
//     public int V() {
//         return V;
//     }
// 
//     // time complexity: O(1)
//     @Override
//     public int E() {
//         return E;
//     }
// 
//     @Override
//     public Graph reverse() {
//         Digraph reversed = new Digraph(V);
// 
//         for (int i = 0; i < V; i++)
//             for (int s : adj(i))
//                 reversed.addEdge(s, i);
// 
//         return reversed;
//     }
// 
//     // TODO: implement me!
//     @Override
//     public String toString() {
//         return null;
//     }
// }
// 
// Path: src/main/java/io/github/marioluan/datastructures/graph/Graph.java
// public interface Graph {
// 
//     /**
//      * Adds an edge v-w.
//      *
//      * @param v vertex v
//      * @param w vertex w
//      */
//     void addEdge(int v, int w);
// 
//     /**
//      * Returns the vertices adjacent to v.
//      *
//      * @param v vertex v
//      * @return vertices adjacent to v
//      */
//     Iterable<Integer> adj(int v);
// 
//     /**
//      * Returns the number of vertices.
//      *
//      * @return number of vertices
//      */
//     int V();
// 
//     /**
//      * Returns the number of edges.
//      *
//      * @return number of edges
//      */
//     int E();
// 
//     /**
//      * Returns its reverse order.
//      *
//      * @return its reverse order
//      */
//     Graph reverse();
// 
//     /**
//      * Returns its string representation.
//      *
//      * @return string representation
//      */
//     String toString();
// }


import io.github.marioluan.datastructures.graph.Digraph;
import io.github.marioluan.datastructures.graph.Graph;
package io.github.marioluan.datastructures.factory;


public final class DirectedAcyclicGraphFactory {
    /**
     * Builds a graph with the same vertices and edges from lecture slides. <br>
     * <strong>https://algs4.cs.princeton.edu/lectures/42DirectedGraphs.pdf</strong>
     */
    public static Graph build() {
        Graph graph = new Digraph(7);

        graph.addEdge(0, 2);
        graph.addEdge(0, 5);
        graph.addEdge(0, 1);

        graph.addEdge(1, 4);

// Path: src/main/java/io/github/marioluan/datastructures/graph/Digraph.java
// public class Digraph implements Graph {
//     private final int V;
//     private int E;
//     private Bag<Integer>[] adj;
// 
//     /**
//      * Creates an empty {@link Digraph}.<br>
//      * time complexity: O(V)
//      *
//      * @param V number of vertices
//      */
//     public Digraph(int V) {
//         this.V = V;
//         adj = (Bag<Integer>[]) new Bag[V];
//         IntStream.range(0, V).forEach(v -> adj[v] = new Bag<>());
//         E = 0;
//     }
// 
//     // time complexity: O(1)
//     @Override
//     public void addEdge(int v, int w) {
//         adj[v].add(w);
//         E++;
//     }
// 
//     // time complexity: outdegree(v)
//     @Override
//     public Iterable<Integer> adj(int v) {
//         return adj[v];
//     }
// 
//     // time complexity: O(1)
//     @Override
//     public int V() {
//         return V;
//     }
// 
//     // time complexity: O(1)
//     @Override
//     public int E() {
//         return E;
//     }
// 
//     @Override
//     public Graph reverse() {
//         Digraph reversed = new Digraph(V);
// 
//         for (int i = 0; i < V; i++)
//             for (int s : adj(i))
//                 reversed.addEdge(s, i);
// 
//         return reversed;
//     }
// 
//     // TODO: implement me!
//     @Override
//     public String toString() {
//         return null;
//     }
// }
// 
// Path: src/main/java/io/github/marioluan/datastructures/graph/Graph.java
// public interface Graph {
// 
//     /**
//      * Adds an edge v-w.
//      *
//      * @param v vertex v
//      * @param w vertex w
//      */
//     void addEdge(int v, int w);
// 
//     /**
//      * Returns the vertices adjacent to v.
//      *
//      * @param v vertex v
//      * @return vertices adjacent to v
//      */
//     Iterable<Integer> adj(int v);
// 
//     /**
//      * Returns the number of vertices.
//      *
//      * @return number of vertices
//      */
//     int V();
// 
//     /**
//      * Returns the number of edges.
//      *
//      * @return number of edges
//      */
//     int E();
// 
//     /**
//      * Returns its reverse order.
//      *
//      * @return its reverse order
//      */
//     Graph reverse();
// 
//     /**
//      * Returns its string representation.
//      *
//      * @return string representation
//      */
//     String toString();
// }


// Path: src/test/java/io/github/marioluan/datastructures/factory/DirectedAcyclicGraphFactory.java
import io.github.marioluan.datastructures.graph.Digraph;
import io.github.marioluan.datastructures.graph.Graph;

package io.github.marioluan.datastructures.factory;


public final class DirectedAcyclicGraphFactory {
    /**
     * Builds a graph with the same vertices and edges from lecture slides. <br>
     * <strong>https://algs4.cs.princeton.edu/lectures/42DirectedGraphs.pdf</strong>
     */
    public static Graph build() {
        Graph graph = new Digraph(7);

        graph.addEdge(0, 2);
        graph.addEdge(0, 5);
        graph.addEdge(0, 1);

        graph.addEdge(1, 4);

        graph.addEdge(5, 2);