code: static <U, V> ImmutableBiMap<U, V> maximumCardinalityBipartiteMatching(Multimap<U, V> graph) {
      return HopcroftKarp.overBipartiteGraph(graph).perform();
    }
docs: Finds a <a
  href="https://en.wikipedia.org/wiki/Matching_(graph_theory)#In_unweighted_bipartite_graphs">
  maximum cardinality matching of a bipartite graph</a>. The vertices of one part of the
  bipartite graph are identified by objects of type {@code U} using object equality. The vertices
  of the other part are similarly identified by objects of type {@code V}. The input bipartite
  graph is represented as a {@code Multimap<U, V>}: each entry represents an edge, with the key
  representing the vertex in the first part and the value representing the value in the second
  part. (Note that, even if {@code U} and {@code V} are the same type, equality between a key and
  a value has no special significance: effectively, they are in different domains.) Fails if any
  of the vertices (keys or values) are null. The output matching is similarly represented as a
  {@code BiMap<U, V>} (the property that a matching has no common vertices translates into the
  bidirectional uniqueness property of the {@link BiMap}).
  
  <p>If there are multiple matchings which share the maximum cardinality, an arbitrary one is
  returned.