11package com .thealgorithms .graph ;
22
3- import static org .junit .jupiter .api .Assertions .*;
3+ import static org .junit .jupiter .api .Assertions .assertEquals ;
4+ import static org .junit .jupiter .api .Assertions .assertFalse ;
45
56import java .util .ArrayList ;
67import java .util .Arrays ;
78import java .util .List ;
89import org .junit .jupiter .api .DisplayName ;
910import org .junit .jupiter .api .Test ;
1011
12+ /**
13+ * Unit tests for Hopcroft–Karp algorithm.
14+ *
15+ * @author ptzecher
16+ */
1117class HopcroftKarpTest {
1218
1319 private static List <List <Integer >> adj (int nLeft ) {
1420 List <List <Integer >> g = new ArrayList <>(nLeft );
15- for (int i = 0 ; i < nLeft ; i ++) g .add (new ArrayList <>());
21+ for (int i = 0 ; i < nLeft ; i ++) { // braces required by Checkstyle
22+ g .add (new ArrayList <>());
23+ }
1624 return g ;
1725 }
1826
@@ -32,10 +40,10 @@ void singleEdge() {
3240 HopcroftKarp hk = new HopcroftKarp (1 , 1 , g );
3341 assertEquals (1 , hk .maxMatching ());
3442
35- int [] L = hk .getLeftMatches ();
36- int [] R = hk .getRightMatches ();
37- assertEquals (0 , L [0 ]);
38- assertEquals (0 , R [0 ]);
43+ int [] leftMatch = hk .getLeftMatches ();
44+ int [] rightMatch = hk .getRightMatches ();
45+ assertEquals (0 , leftMatch [0 ]);
46+ assertEquals (0 , rightMatch [0 ]);
3947 }
4048
4149 @ Test
@@ -50,18 +58,19 @@ void disjointEdges() {
5058 HopcroftKarp hk = new HopcroftKarp (3 , 3 , g );
5159 assertEquals (3 , hk .maxMatching ());
5260
53- int [] L = hk .getLeftMatches ();
54- int [] R = hk .getRightMatches ();
61+ int [] leftMatch = hk .getLeftMatches ();
62+ int [] rightMatch = hk .getRightMatches ();
5563 for (int i = 0 ; i < 3 ; i ++) {
56- assertEquals (i , L [i ]);
57- assertEquals (i , R [i ]);
64+ assertEquals (i , leftMatch [i ]);
65+ assertEquals (i , rightMatch [i ]);
5866 }
5967 }
6068
6169 @ Test
6270 @ DisplayName ("Complete bipartite K(3,4) matches min(3,4)=3" )
6371 void completeK34 () {
64- int nLeft = 3 , nRight = 4 ;
72+ int nLeft = 3 ;
73+ int nRight = 4 ; // split declarations
6574 List <List <Integer >> g = adj (nLeft );
6675 for (int u = 0 ; u < nLeft ; u ++) {
6776 g .get (u ).addAll (Arrays .asList (0 , 1 , 2 , 3 ));
@@ -70,10 +79,10 @@ void completeK34() {
7079 assertEquals (3 , hk .maxMatching ());
7180
7281 // sanity: no two left vertices share the same matched right vertex
73- int [] L = hk .getLeftMatches ();
82+ int [] leftMatch = hk .getLeftMatches ();
7483 boolean [] used = new boolean [nRight ];
7584 for (int u = 0 ; u < nLeft ; u ++) {
76- int v = L [u ];
85+ int v = leftMatch [u ];
7786 if (v != -1 ) {
7887 assertFalse (used [v ]);
7988 used [v ] = true ;
@@ -82,10 +91,10 @@ void completeK34() {
8291 }
8392
8493 @ Test
85- @ DisplayName ("Non-square , sparse graph" )
94+ @ DisplayName ("Rectangular , sparse graph" )
8695 void rectangularSparse () {
8796 // Left: 5, Right: 2
88- // edges: L0-R0, L1-R1, L2-R0, L3-R1 (max matching = 2)
97+ // edges: L0-R0, L1-R1, L2-R0, L3-R1 (max matching = 2)
8998 List <List <Integer >> g = adj (5 );
9099 g .get (0 ).add (0 );
91100 g .get (1 ).add (1 );
@@ -96,27 +105,22 @@ void rectangularSparse() {
96105 HopcroftKarp hk = new HopcroftKarp (5 , 2 , g );
97106 assertEquals (2 , hk .maxMatching ());
98107
99- int [] L = hk .getLeftMatches ();
100- int [] R = hk .getRightMatches ();
108+ int [] leftMatch = hk .getLeftMatches ();
109+ int [] rightMatch = hk .getRightMatches ();
101110
102- // Check consistency: if L [u]=v then R [v]=u
111+ // Check consistency: if leftMatch [u]=v then rightMatch [v]=u
103112 for (int u = 0 ; u < 5 ; u ++) {
104- int v = L [u ];
113+ int v = leftMatch [u ];
105114 if (v != -1 ) {
106- assertEquals (u , R [v ]);
115+ assertEquals (u , rightMatch [v ]);
107116 }
108117 }
109118 }
110119
111120 @ Test
112- @ DisplayName ("Layering advantage case (chains of short augmenting paths)" )
121+ @ DisplayName ("Layering advantage case (short augmenting paths)" )
113122 void layeringAdvantage () {
114123 // Left 4, Right 4
115- // Build a structure that benefits from BFS layering
116- // L0: R0, R1
117- // L1: R1, R2
118- // L2: R2, R3
119- // L3: R0, R3
120124 List <List <Integer >> g = adj (4 );
121125 g .get (0 ).addAll (Arrays .asList (0 , 1 ));
122126 g .get (1 ).addAll (Arrays .asList (1 , 2 ));
@@ -126,4 +130,4 @@ void layeringAdvantage() {
126130 HopcroftKarp hk = new HopcroftKarp (4 , 4 , g );
127131 assertEquals (4 , hk .maxMatching ()); // perfect matching exists
128132 }
129- }
133+ }
0 commit comments