public Digraph reverse()
	{
		Digraph R = new Digraph(V());
		for (int v = 0; v < V(); v++)
			for (int w : adj(v))
				try
				{
					R.addEdge(w, v);
				}
				catch (Exception e)
				{
					// No Exception can arise as R is being constructed from a
					// valid DG
					assert (v < 0 || v >= V() || w < 0 || w >= V());
					assert (v == w);
					for (int a : adj[v])
						assert (a == w);
				}
		return R;
	}