Provides an edge-reversed view $g'$ of a directed graph $g$. The vertex sets for the two graphs
are the same, but g' contains an edge $(v2, v1)$ iff g$$ contains an edge $(v1, v2)$. $g'$ is
backed by $g$, so changes to $g$ are reflected in $g'$, and vice versa.

This class allows you to use a directed graph algorithm in reverse. For example, suppose you have
a directed graph representing a tree, with edges from parent to child, and you want to find all
of the parents of a node. To do this, simply create an edge-reversed graph and pass that as input
to DepthFirstIterator.

getAllEdges

Returns a set of all edges connecting source vertex to target vertex if such vertices exist
in this graph. If any of the vertices does not exist or is null, returns
null. If both vertices exist but no edges found, returns an empty set.

In undirected graphs, some of the returned edges may have their source and target vertices in
the opposite order. In simple graphs the returned set is either singleton set or empty set.

addEdge

Creates a new edge in this graph, going from the source vertex to the target vertex, and
returns the created edge. Some graphs do not allow edge-multiplicity. In such cases, if the
graph already contains an edge from the specified source to the specified target, than this
method does not change the graph and returns null.

The source and target vertices must already be contained in this graph. If they are not found
in graph IllegalArgumentException is thrown.

This method creates the new edge e using this graph's edge supplier (see
Graph.getEdgeSupplier()). For the new edge to be added e must not be
equal to any other edge the graph (even if the graph allows edge-multiplicity). More
formally, the graph must not contain any edge e2 such that
e2.equals(e). If such
e2 is found then the newly created edge e is abandoned, the method leaves
this graph unchanged and returns null.

addEdge

Adds the specified edge to this graph, going from the source vertex to the target vertex.
More formally, adds the specified edge,
e, to this graph if this graph contains no edge e2 such that
e2.equals(e). If this graph already contains such an edge, the call leaves this
graph unchanged and returns false. Some graphs do not allow edge-multiplicity. In
such cases, if the graph already contains an edge from the specified source to the specified
target, than this method does not change the graph and returns
false. If the edge was added to the graph, returns
true.

The source and target vertices must already be contained in this graph. If they are not found
in graph IllegalArgumentException is thrown.