// Path: src/com/algorithms/elementary/ArrayBag.java
// public class ArrayBag<T> implements Bag<T>{
// 	
// 	public static void main(String[] args) {
// 		Bag<Integer> bag = new LinkedBag<>();
// 		bag.add(1);
// 		bag.add(2);
// 		bag.add(3);
// 		bag.add(4);
// 		bag.add(5);
// 		for (Integer a : bag)
// 			System.out.println(a);
// 	}
// 	
// 	
// 	private static int DEFAULT_CAPACITY = 16;
// 	private int capacity;
// 	private T[] base;
// 	private int index;//ÔªËØµÄÊýÁ¿
// 	
// 	public ArrayBag() {
// 		this.capacity = DEFAULT_CAPACITY;
// 		base = (T[]) new Object[capacity];
// 	}
// 	
// 	public ArrayBag(int capacity) {
// 		this.capacity = capacity;
// 		base = (T[]) new Object[capacity];
// 	}
// 	
// 	private class ArrayBagIterator implements Iterator<T> {
// 		
// 		int amount = index;
// 		
// 		@Override
// 		public boolean hasNext() {
// 			return amount > 0;
// 		}
// 
// 		@Override
// 		public T next() {
// 			return base[--amount];
// 		}
// 		
// 	}
// 	
// 	@Override
// 	public Iterator<T> iterator() {
// 		return new ArrayBagIterator();
// 	}
// 
// 	@SuppressWarnings("unchecked")
// 	private void resize(int newSize) {
// 		T[] oldBase = base;
// 		base = (T[]) new Object[newSize];
// 		for (int i = 0; i < index; i++) 
// 			base[i] = oldBase[i];
// 	}
// 	
// 	@Override
// 	public void add(T t) {
// 		if(base.length == index) {
// 			capacity = capacity * 2;
// 			resize(capacity);
// 		}
// 		base[index++] = t;
// 	}
// 
// 	@Override
// 	public boolean isEmpty() {
// 		return index == 0;
// 	}
// 
// 	@Override
// 	public int size() {
// 		return index;
// 	}
// 	
// 	@Override
// 	public String toString() {
// 		StringBuilder sb = new StringBuilder();
// 		for(T t : this)
// 			sb.append(t + " ");
// 		return sb.toString();
// 	}
// }
// 
// Path: src/com/algorithms/elementary/Bag.java
// public interface Bag<T> extends Iterable<T>{
// 	void add (T t);
// 	boolean isEmpty();
// 	int size();
// }


import java.util.Arrays;
import com.algorithms.elementary.ArrayBag;
import com.algorithms.elementary.Bag;
		for (int i = 0; i < adj.length; i++) 
			adj[i] = new ArrayBag<>();
	}
	
	//Í¬Ò»¸öµã»á¼ÓÁ½±é£¬±ÈÈç(1, 1)
	public void addEdge(DirectedEdge e) {
		int v = e.from();
		adj[v].add(e);
		edgeNum++;
	}
	
	public Iterable<DirectedEdge> adj(int v) { //vertices adjacent to v
		return adj[v];
	}
	
	public int vertices() { //number of vertices(vertex)
		return size;
	}
	
	public Iterable<DirectedEdge> edges() { // all edges in the graph
		Bag<DirectedEdge> set = new ArrayBag<>();
		for (Bag<DirectedEdge> bag : adj) {
			for (DirectedEdge edge : bag) {
				set.add(edge);
			}
		}
		return set;
	}

	@Override
// Path: src/com/algorithms/elementary/ArrayBag.java
// public class ArrayBag<T> implements Bag<T>{
// 	
// 	public static void main(String[] args) {
// 		Bag<Integer> bag = new LinkedBag<>();
// 		bag.add(1);
// 		bag.add(2);
// 		bag.add(3);
// 		bag.add(4);
// 		bag.add(5);
// 		for (Integer a : bag)
// 			System.out.println(a);
// 	}
// 	
// 	
// 	private static int DEFAULT_CAPACITY = 16;
// 	private int capacity;
// 	private T[] base;
// 	private int index;//ÔªËØµÄÊýÁ¿
// 	
// 	public ArrayBag() {
// 		this.capacity = DEFAULT_CAPACITY;
// 		base = (T[]) new Object[capacity];
// 	}
// 	
// 	public ArrayBag(int capacity) {
// 		this.capacity = capacity;
// 		base = (T[]) new Object[capacity];
// 	}
// 	
// 	private class ArrayBagIterator implements Iterator<T> {
// 		
// 		int amount = index;
// 		
// 		@Override
// 		public boolean hasNext() {
// 			return amount > 0;
// 		}
// 
// 		@Override
// 		public T next() {
// 			return base[--amount];
// 		}
// 		
// 	}
// 	
// 	@Override
// 	public Iterator<T> iterator() {
// 		return new ArrayBagIterator();
// 	}
// 
// 	@SuppressWarnings("unchecked")
// 	private void resize(int newSize) {
// 		T[] oldBase = base;
// 		base = (T[]) new Object[newSize];
// 		for (int i = 0; i < index; i++) 
// 			base[i] = oldBase[i];
// 	}
// 	
// 	@Override
// 	public void add(T t) {
// 		if(base.length == index) {
// 			capacity = capacity * 2;
// 			resize(capacity);
// 		}
// 		base[index++] = t;
// 	}
// 
// 	@Override
// 	public boolean isEmpty() {
// 		return index == 0;
// 	}
// 
// 	@Override
// 	public int size() {
// 		return index;
// 	}
// 	
// 	@Override
// 	public String toString() {
// 		StringBuilder sb = new StringBuilder();
// 		for(T t : this)
// 			sb.append(t + " ");
// 		return sb.toString();
// 	}
// }
// 
// Path: src/com/algorithms/elementary/Bag.java
// public interface Bag<T> extends Iterable<T>{
// 	void add (T t);
// 	boolean isEmpty();
// 	int size();
// }


// Path: src/com/algorithms/graph/EdgeWeightedDigraph.java
import java.util.Arrays;
import com.algorithms.elementary.ArrayBag;
import com.algorithms.elementary.Bag;

		for (int i = 0; i < adj.length; i++) 
			adj[i] = new ArrayBag<>();
	}
	
	//Í¬Ò»¸öµã»á¼ÓÁ½±é£¬±ÈÈç(1, 1)
	public void addEdge(DirectedEdge e) {
		int v = e.from();
		adj[v].add(e);
		edgeNum++;
	}
	
	public Iterable<DirectedEdge> adj(int v) { //vertices adjacent to v
		return adj[v];
	}
	
	public int vertices() { //number of vertices(vertex)
		return size;
	}
	
	public Iterable<DirectedEdge> edges() { // all edges in the graph
		Bag<DirectedEdge> set = new ArrayBag<>();
		for (Bag<DirectedEdge> bag : adj) {
			for (DirectedEdge edge : bag) {
				set.add(edge);
			}
		}
		return set;
	}

	@Override
	public String toString() {