How to find all systems of distinct representatives using i.e. Hopcroft–Karp algorithm? I would like to find all systems of distinct representatives in bipartite graph. I've found Hopcroft–Karp algorithm, which finds maximal matching, which I would like to implement. But I don't know how should I modify it to find ALL transversals. 
Or maybe, someone knows any other solution to solve this problem, it doesn't need to be very quick algorithm.
Could somebody give me some tips? Thank you in advance
 A: Let's unpack the problem in the context of presenting an algorithm for iterating over maximum bipartite matchings proposed by T. Uno (1997).
A matching of a (simple, undirected) graph $M$ is a set of edges such that no vertex is incident with more than one edge in $M$.  Alternatively we could say that no two edges of $M$ meet at (share) any vertex in $G$.  In the discussion that follows $G$ will always be a finite graph, so that the size $|M|$ is finite as well.
Note three possible kinds of matchings that might be of interest for a bipartite graph $G=(V,E)$ where $V=V_1 \cup V_2$ is the disjoint union of two "parts":


*

*A perfect matching is a subset of edges $M\subseteq E$ so that each vertex of $G$ is incident to one edge in $M$.

*A maximum matching is a subset of edges $M\subseteq E$ so that no other matching of $G$ has a greater size (cardinality).

*A maximal matching is a subset of edges $M\subseteq E$ so that no other matching properly contains $M$.
It is evident from these definitions that for matchings $M$, perfect $\implies$ maximum $\implies$ maximal.

Since the current wording of the Question asks about a system of distinct representatives (SDR), it is worth taking a moment to review the connection of these with matchings.  We especially want to show that any SDR corresponds to a maximum matching for a particular bipartite graph, but maximum matchings need not result in SDRs (if no SDRs exist).
Given a finite family of finite sets $\mathscr{F} = [S_1,S_2,\ldots,S_k]$, where sets $S_i$ are not necessarily disjoint or even distinct (so that $\mathscr{F}$ could be a multiset if the ordering of sets $S_i$ were ignored), a system of distinct representatives is a sequence $[x_1,x_2,\ldots,x_k]$ of distinct elements $x_i \in S_i$.  Note that $x_i\neq x_j$ whenever $i\neq j$, even though we do not require $S_i\neq S_j$.  That is, the $x_i$ are distinct as representatives chosen for the sets $S_i$.
Let $\mathscr{S} = \bigcup_{i=1}^k S_i$.  Any SDR of $\mathscr{F}$ is then a maximum matching of a bipartite graph whose edges consist of all $(x,S_i)$ for all $x\in \mathscr{S}$ and $S_i \in \mathscr{F}$ such that $x\in S_i$.  This is evident because $|\mathscr{F}|=k$, so the largest cardinality of a matching in such a bipartite graph is at most $k$.
On the other hand a maximum matching of this bipartite graph will always exist (some matching attains the largest possible size, by finiteness), even if no SDR is possible.  To give a simple example, suppose $S_1 = S_2 = \{0\}$.  Then there is a maximum matching (actually there are two), but $0$ can only be chosen as a representative for either $S_1$ or $S_2$.  Since representatives must be distinct, neither of the maximum matchings provides a system of distinct representatives.
Thus: if any SDR exists, all SDRs correspond to maximum matchings of the above constructed bipartite graph, and SDRs exist if and only if a maximum matching has size $|\mathscr{F}|$.

Let us henceforth set aside the systems of distinct representatives and focus only on the problem of iterating over maximum matchings $M$ of bipartite graph $G = (V_1\cup V_2, E)$ as introduced at the top.  Let $n=|V_1|+|V_2|$ be the number of vertices, and let $m=|E|$ be the number of edges.
For the moment we give only a very high-level outline of the algorithm proposed by T. Uno, assuming our Reader's familiarity with the notion of augmenting paths in connection with maximum matchings:
Step 1 Find one maximum matching $M$ of $G$ and output this.  (For this step the algorithm of Hopcraft and Karp (1973) already mentioned by the OP will do nicely.  In the worst case it has $O(mn^{1/2})$ running time.)
Step 2 Define a directed graph $D(G,M)$ by orienting the edges of $M$ from $V_1$ to $V_2$ and the remaining edges of $G$ (not belonging to $M$) from $V_2$ to $V_1$.  Decompose $D(G,M)$ into its strongly connected components and trim away arcs that do not belong to any cycle of $D(G,M)$, leaving a (possibly smaller) directed graph $D'$.
Step 3 Call a recursive procedure Enum_Maximum_Matchings_Iter(G,M,D') which will output any additional maximum matchings.
Clearly the heavy lifting is being done in by calling the recursive procedure, and for the time being I will give only a cursory summary of its operation:


*

*If $G$ has no edge, halt.

*If $D'$ contains a cycle, choose an edge $e$ and a cycle containing that edge.  Exchange edges along that cycle and output the resulting maximum matching $M'$.  Make a pair of recursive calls (to Enum_Maximum_Matchings_Iter) on two subproblems, one for graph $G^+(e)$ (obtained by deleting edge $e$, its endpoints and adjacent edges from $G$) and matching $M\setminus\{e\}$) and one for graph $G^-(e)$ (obtained by deleting $e$ from $G$) and matching $M'$.  Halt.

*If $D'$ contains no cycle, find a length two augmenting path in $D'$ starting from a vertex $v$ not covered by $M$, or halt if no such path exists.  Let $e$ be the edge of this path not in $M$ and construct the new matching $M'$ by exchanging edges along the path.  Make a pair of recursive calls on two subproblems, one for graph $G^+(e)$ and matching $M'$ and one for graph $G^-(e)$ and matching $M$.  Halt.
Among other omissions I have not described the trimmed directed graph $D'$ which is to be passed to the recursive calls in this précis.  In the first pair of recursive calls these are the natural choices, trimming $D(G^+(e),M\setminus\{e\})$ and $D(G^-(e),M')$ respectively.  In the second pair there are no cycles and we can skip the trimmings; the argument $D'$ to be passed is an empty directed graph for both of those recursive calls.
more to come
