import java.util.*;

class DenseGraph <E extends Edge> extends Graph<E> {
	ArrayList<ArrayList<E>> edges;
	//3ICE: Ennél már az Object[][] is jobb... Igen, (E)-re cast-olással mindenhol.
	int size;
	
	public DenseGraph(int n) {
		size = n;
		edges = new ArrayList<>(n);
		for(int i=0;i<n;i++){
			edges.add(new ArrayList<E>(n));
		}
		//for(ArrayList e : edges)e=new ArrayList<>(n);
	}
	
	boolean hasEdge(int i, int j) {
		//System.out.println("hasEdge "+i+" "+j);
		//for(E x : edges.get(i)){System.out.println(x);}
		//return edges.get(i).get(j)!=null;
		for(E e : edges.get(i)){
			if(e.getTarget()==j) return true;
		}
		return false;
	}

	E getEdge(int i, int j) {
		for(E e : edges.get(i)){
			if(e.getTarget()==j) return e;
		}
		return null;
	}

	Set<E> edgesFrom(int i) {
		Set<E> ret = new HashSet<>();
		for (int j = 0; j < size; ++j) {
			if (hasEdge(i, j)) {
				ret.add(getEdge(i, j));
			}
		}
		return ret;
	}
	
	void addEdge(E e) {
		//System.out.println("addEdge "+edges);
		//for(E x : edges.get(e.getSource())){System.out.println(x);}
		//System.out.println(Arrays.toString(edges.get(e.getSource())));
		edges.get(e.getSource()).add(e);
	}
}