public static Digraph rootedOutDAG(int V, int E) {
		if (E > (long) V * (V - 1) / 2)
			throw new IllegalArgumentException("Too many edges");
		if (E < V - 1)
			throw new IllegalArgumentException("Too few edges");
		Digraph G = new Digraph(V);
		SET<Edge> set = new SET<Edge>();

		// fix a topological order
		int[] vertices = new int[V];
		for (int i = 0; i < V; i++)
			vertices[i] = i;
		StdRandom.shuffle(vertices);

		// one edge pointing from each vertex, other than the root =
		// vertices[V-1]
		for (int v = 0; v < V - 1; v++) {
			int w = StdRandom.uniform(v + 1, V);
			Edge e = new Edge(v, w);
			set.add(e);
			G.addEdge(vertices[w], vertices[v]);
		}

		while (G.E() < E) {
			int v = StdRandom.uniform(V);
			int w = StdRandom.uniform(V);
			Edge e = new Edge(v, w);
			if ((v < w) && !set.contains(e)) {
				set.add(e);
				G.addEdge(vertices[w], vertices[v]);
			}
		}
		return G;
	}