# Hall violator

In graph theory, a Hall violator is a set of vertices in a graph, that violate the condition to Hall's marriage theorem.
Formally, given a bipartite graph G = (X + Y, E), a Hall-violator in X is a subset W of X, for which |N$_G$(W)| < |W|, where N$_G$(W) is the set of neighbors of W in G.
If W is a Hall violator, then there is no matching that saturates all vertices of W. Therefore, there is also no matching that saturates X. Hall's marriage theorem says that the opposite is also true: if there is no Hall violator, then there exists a matching that saturates X.

## Algorithms
### Finding a Hall violator

A Hall violator can be found by an efficient algorithm. The algorithm below uses the following terms:
* An M-alternating path, for some matching M, is a path in which the first edge is not an edge of M, the second edge is of M, the third is not of M, etc.
* A vertex z is M-reachable from some vertex x, if there is an M-alternating path from x to z.
As an example, consider the figure at the right, where the vertical (blue) edges denote the matching M. The vertex sets Y$_1$, X$_1$,Y$_2$, X$_2$, are M-reachable from x$_0$ (or any other vertex of X$_0$), but Y$_3$ and X$_3$ are not M-reachable from x$_0$.
The algorithm for finding a Hall violator proceeds as follows.
* Find a maximum matching M (it can be found with the Hopcroft–Karp algorithm).
* If all vertices of X are matched, then return "There is no Hall violator".
* Otherwise, let x$_0$ be an unmatched vertex.
* Let W be the set of all vertices of X that are M-reachable from x$_0$ (it can be found using Breadth-first search; in the figure, W contains x$_0$ and X$_1$ and X$_2$).
* Return W.
This W is indeed a Hall-violator because of the following facts:
* All vertices of N$_G$(W) are matched by M. Suppose by contradiction that some vertex y in N$_G$(W) is unmatched by M. Let x be its neighbor in W. The path from x$_0$ to x to y is an M-augmenting path - it is M-alternating and it starts and ends with unmatched vertices, so by "inverting" it we can increase M, contradicting its maximality.
* W contains all the matches of N$_G$(W) by M. This is because all these matches are M-reachable from x$_0$.
* W contains another vertex - x$_0$ - that is unmatched by M by definition.
* Hence, |W| = |N$_G$(W)| + 1 > |N$_G$(W)|, so W indeed satisfies the definition of a Hall violator.

### Finding minimal and minimum Hall violators

An inclusion-minimal Hall violator is a Hall violator such that each of its subsets is not a Hall violator.
The above algorithm, in fact, finds an inclusion-minimal Hall violator. This is because, if any vertex is removed from W, then the remaining vertices can be perfectly matched to the vertices of N$_G$(W) (either by edges of M, or by edges of the M-alternating path from x$_0$).
The above algorithm does not necessarily find a minimum-cardinality Hall violator. For example, in the above figure, it returns a Hall violator of size 5, while X$_0$ is a Hall violator of size 3.
In fact, finding a minimum-cardinality Hall violator is NP-hard. This can be proved by reduction from the Clique problem.

### Finding a Hall violator or an augmenting path

The following algorithm takes as input an arbitrary matching M in a graph, and a vertex x$_0$ in X that is not saturated by M.
It returns as output, either a Hall violator that contains x$_0$, or a path that can be used to augment M.
* Set k = 0, W$_k$ := {x$_0$}, Z$_k$ :=.
* Assert:
** W$_k$ = {x$_0$,...,x$_k$} where the x$_i$ are distinct vertices of X;
** Z$_k$ = {y$_1$,...,y$_k$} where the y$_i$ are distinct vertices of Y;
** For all i ≥ 1, y$_i$ is matched to x$_i$ by M.
** For all i ≥ 1, y$_i$ is connected to some x$_j$$_{<i}$ by an edge not in M.
* If N$_G$(W$_k$) ⊆ Z$_k$, then W$_k$ is a Hall violator, since |W$_k$| = k+1 > k = |Z$_k$| ≥ |N$_G$(W$_k$)|. Return the Hall-violator W$_k$.
* Otherwise, let y$_{k+1}$ be a vertex in N$_G$(W$_k$) \ Z$_k$. Consider the following two cases:
* Case 1: y$_{k+1}$ is matched by M.
** Since x$_0$ is unmatched, and every x$_i$ in W$_k$ is matched to y$_i$ in Z$_k$, the partner of this y$_{k+1}$ must be some vertex of X that is not in W$_k$. Denote it by x$_{k+1}$.
** Let W$_{k+1}$ := W$_k$ U {x$_{k+1}$} and Z$_{k+1}$ := Z$_k$ U {y$_{k+1}$} and k := k + 1.
** Go back to step 2.
* Case 2: y$_{k+1}$ is unmatched by M.
** Since y$_{k+1}$ is in N$_G$(W$_k$), it is connected to some x$_i$ (for i < k + 1) by an edge not in M. x$_i$ is connected to y$_i$ by an edge in M. y$_i$ is connected to some x$_j$ (for j < i) by an edge not in M, and so on. Following these connections must eventually lead to x$_0$, which is unmatched. Hence we have an M-augmenting path. Return the M-augmenting path.
At each iteration, W$_k$ and Z$_k$ grow by one vertex. Hence, the algorithm must finish after at most |X| iterations.
The procedure can be used iteratively: start with M being an empty matching, call the procedure again and again, until either a Hall violator is found, or the matching M saturates all vertices of X. This provides a constructive proof to Hall's theorem.