The **blossom algorithm** is an algorithm in graph theory for constructing maximum matchings on graphs. The algorithm was developed by Jack Edmonds in 1961,^{[1]} and published in 1965.^{[2]} Given a general graph *G* = (*V*, *E*), the algorithm finds a matching *M* such that each vertex in *V* is incident with at most one edge in *M* and |*M*| is maximized. The matching is constructed by iteratively improving an initial empty matching along augmenting paths in the graph. Unlike bipartite matching, the key new idea is that an odd-length cycle in the graph (blossom) is contracted to a single vertex, with the search continuing iteratively in the contracted graph.

A major reason that the blossom algorithm is important is that it gave the first proof that a maximum-size matching could be found using a polynomial amount of computation time. Another reason is that it led to a linear programming polyhedral description of the matching polytope, yielding an algorithm for min-*weight* matching.^{[3]} As elaborated by Alexander Schrijver, further significance of the result comes from the fact that this was the first polytope whose proof of integrality "does not simply follow just from total unimodularity, and its description was a breakthrough in polyhedral combinatorics."^{[4]}

## Augmenting paths

Given *G* = (*V*, *E*) and a matching *M* of *G*, a vertex *v* is **exposed** if no edge of *M* is incident with *v*. A path in *G* is an **alternating path**, if its edges are alternately not in *M* and in *M* (or in *M* and not in *M*). An **augmenting path** *P* is an alternating path that starts and ends at two distinct exposed vertices. Note that number of unmatched edges in an augmenting path is greater by one than the number of matched edges, and hence the total number of edges in an augmenting path is odd. A **matching augmentation** along an augmenting path *P* is the operation of replacing *M* with a new matching .

By Berge's lemma, matching *M* is maximum if and only if there is no *M*-augmenting path in *G*.^{[5]}^{[6]} Hence, either a matching is maximum, or it can be augmented. Thus, starting from an initial matching, we can compute a maximum matching by augmenting the current matching with augmenting paths as long as we can find them, and return whenever no augmenting paths are left. We can formalize the algorithm as follows:

INPUT: GraphG, initial matchingMonGOUTPUT: maximum matchingM*onGA1functionfind_maximum_matching(G,M) :M*A2P←find_augmenting_path(G,M) A3ifPis non-emptythenA4returnfind_maximum_matching(G, augmentMalongP) A5elseA6returnM A7end ifA8end function

We still have to describe how augmenting paths can be found efficiently. The subroutine to find them uses blossoms and contractions.

## Blossoms and contractions

Given *G* = (*V*, *E*) and a matching *M* of *G*, a *blossom* *B* is a cycle in *G* consisting of *2k + 1* edges of which exactly *k* belong to *M*, and where one of the vertices *v* of the cycle (the *base*) is such that there exists an alternating path of even length (the *stem*) from *v* to an exposed vertex *w*.

**Finding Blossoms:**

- Traverse the graph starting from an exposed vertex.
- Starting from that vertex, label it as an outer vertex "
.**o**" - Alternate the labeling between vertices being inner "
and outer "**i**"such that no two adjacent vertices have the same label.**o**" - If we end up with two adjacent vertices labeled as outer "
then we have an odd-length cycle and hence a blossom.**o**"

Define the **contracted graph** *G’* as the graph obtained from *G* by contracting every edge of *B*, and define the **contracted matching** *M’* as the matching of *G’* corresponding to *M*.

*G’* has an *M’*-augmenting path if and only if *G* has an *M*-augmenting path, and that any *M’*-augmenting path *P’* in *G’* can be **lifted** to an *M*-augmenting path in *G* by undoing the contraction by *B* so that the segment of *P’* (if any) traversing through *v _{B}* is replaced by an appropriate segment traversing through

*B*.

^{[7]}In more detail:

- if
*P’*traverses through a segment*u → v*in_{B}→ w*G’*, then this segment is replaced with the segment*u → ( u’ → ... → w’ ) → w*in*G*, where blossom vertices*u’*and*w’*and the side of*B*,*( u’ → ... → w’ )*, going from*u’*to*w’*are chosen to ensure that the new path is still alternating (*u’*is exposed with respect to , ).

- if
*P’*has an endpoint*v*, then the path segment_{B}*u → v*in_{B}*G’*is replaced with the segment*u → ( u’ → ... → v’ )*in*G*, where blossom vertices*u’*and*v’*and the side of*B*,*( u’ → ... → v’ )*, going from*u’*to*v’*are chosen to ensure that the path is alternating (*v’*is exposed, ).

Thus blossoms can be contracted and search performed in the contracted graphs. This reduction is at the heart of Edmonds' algorithm.

## Finding an augmenting path

The search for an augmenting path uses an auxiliary data structure consisting of a forest *F* whose individual trees correspond to specific portions of the graph *G*. In fact, the forest *F* is the same that would be used to find maximum matchings in bipartite graphs (without need for shrinking blossoms). In each iteration the algorithm either (1) finds an augmenting path, (2) finds a blossom and recurses onto the corresponding contracted graph, or (3) concludes there are no augmenting paths. The auxiliary structure is built by an incremental procedure discussed next.^{[7]}

The construction procedure considers vertices *v* and edges *e* in *G* and incrementally updates *F* as appropriate. If *v* is in a tree *T* of the forest, we let *root(v)* denote the root of *T*. If both *u* and *v* are in the same tree *T* in *F*, we let *distance(u,v)* denote the length of the unique path from *u* to *v* in *T*.

INPUT: GraphG, matchingMonGOUTPUT: augmenting pathPinGor empty path if none found B01functionfind_augmenting_path(G,M) :PB02F← empty forest B03 unmark all vertices and edges inG, mark all edges ofMB05for eachexposed vertexvdoB06 create a singleton tree {v} and add the tree toFB07end forB08whilethere is an unmarked vertexvinFwithdistance( v, root( v ) )evendoB09whilethere exists an unmarked edgee= {v,w}doB10ifwis not inFthen//wis matched, so addeandw's matched edge toFB11x← vertex matched towinMB12 add edges {v,w} and {w,x} to the tree ofvB13elseB14ifdistance( w, root( w ) )is oddthen// Do nothing. B15elseB16ifroot( v )≠root( w )then// Report an augmenting path in F {e}. B17P← path (root(v) → ... →v) → (w→ ... →root(w) ) B18returnPB19else// Contract a blossom inGand look for the path in the contracted graph. B20B← blossom formed byeand edges on the pathv→winTB21G’, M’← contractGandMbyBB22P’←find_augmenting_path(G’,M’) B23P← liftP’toGB24returnPB25end ifB26end ifB27end ifB28 mark edgeeB29end whileB30 mark vertexvB31end whileB32returnempty path B33end function

### Examples

The following four figures illustrate the execution of the algorithm. Dashed lines indicate edges that are currently not present in the forest. First, the algorithm processes an out-of-forest edge that causes the expansion of the current forest (lines B10 – B12).

Next, it detects a blossom and contracts the graph (lines B20 – B21).

Finally, it locates an augmenting path P′ in the contracted graph (line B22) and lifts it to the original graph (line B23). Note that the ability of the algorithm to contract blossoms is crucial here; the algorithm cannot find *P* in the original graph directly because only out-of-forest edges between vertices at even distances from the roots are considered on line B17 of the algorithm.

### Analysis

The forest *F* constructed by the *find_augmenting_path()* function is an alternating forest.^{[8]}

- a tree
*T*in*G*is an**alternating tree**with respect to*M*, if*T*contains exactly one exposed vertex*r*called the tree root- every vertex at an odd distance from the root has exactly two incident edges in
*T*, and - all paths from
*r*to leaves in*T*have even lengths, their odd edges are not in*M*and their even edges are in*M*.

- a forest
*F*in*G*is an**alternating forest**with respect to*M*, if- its connected components are alternating trees, and
- every exposed vertex in
*G*is a root of an alternating tree in*F*.

Each iteration of the loop starting at line B09 either adds to a tree *T* in *F* (line B10) or finds an augmenting path (line B17) or finds a blossom (line B20). It is easy to see that the running time is . Micali and Vazirani^{[9]} show an algorithm that constructs maximum matching in time.

### Bipartite matching

The algorithm reduces to the standard algorithm for matching in bipartite graphs^{[6]} when *G* is bipartite. As there are no odd cycles in *G* in that case, blossoms will never be found and one can simply remove lines B20 – B24 of the algorithm.

### Weighted matching

The matching problem can be generalized by assigning weights to edges in *G* and asking for a set *M* that produces a matching of maximum (minimum) total weight. The weighted matching problem can be solved by a combinatorial algorithm that uses the unweighted Edmonds's algorithm as a subroutine.^{[5]} Kolmogorov provides an efficient C++ implementation of this.^{[10]}

## References

**^**Edmonds, Jack (1961), "A glimpse of heaven", in J.K. Lenstra; A.H.G. Rinnooy Kan; A. Schrijver,*History of Mathematical Programming --- A Collection of Personal Reminiscences*, CWI, Amsterdam and North-Holland, Amsterdam, pp. 32–54**^**Edmonds, Jack (1965). "Paths, trees, and flowers".*Can. J. Math*.**17**: 449–467. doi:10.4153/CJM-1965-045-4.**^**Edmonds, Jack (1965). "Maximum matching and a polyhedron with 0,1-vertices".*Journal of Research of the National Bureau of Standards Section B*.**69**: 125–130.**^**Schrijver, Alexander.*Combinatorial Optimization: Polyhedra and Efficiency*. Algorithms and Combinatorics.**24**. Springer.- ^
^{a}^{b}Lovász, László; Plummer, Michael (1986).*Matching Theory*. Akadémiai Kiadó. ISBN 963-05-4168-8. - ^
^{a}^{b}Karp, Richard, "Edmonds's Non-Bipartite Matching Algorithm",*Course Notes. U. C. Berkeley*(PDF), archived from the original (PDF) on 2008-12-30 - ^
^{a}^{b}Tarjan, Robert, "Sketchy Notes on Edmonds' Incredible Shrinking Blossom Algorithm for General Matching",*Course Notes, Department of Computer Science, Princeton University*(PDF) **^**Kenyon, Claire; Lovász, László, "Algorithmic Discrete Mathematics",*Technical Report CS-TR-251-90, Department of Computer Science, Princeton University***^**Micali, Silvio; Vazirani, Vijay (1980).*An O(V*. 21st Annual Symposium on Foundations of Computer Science,. IEEE Computer Society Press, New York. pp. 17–27.^{1/2}E) algorithm for finding maximum matching in general graphs**^**Kolmogorov, Vladimir (2009), "Blossom V: A new implementation of a minimum cost perfect matching algorithm",*Mathematical Programming Computation*,**1**(1): 43–67