Files
C-Plus-Plus/d1/d9a/hopcroft__karp_8cpp_source.html
2025-08-14 04:29:32 +00:00

400 lines
55 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- HTML header for doxygen 1.12.0-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.14.0"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>TheAlgorithms/C++: graph/hopcroft_karp.cpp Source File</title>
<link rel="icon" href="../../favicon.svg" type="image/x-icon" />
<link href="../../tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../jquery.js"></script>
<script type="text/javascript" src="../../dynsections.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@xpack-3rd-party/doxygen-awesome-css@2.2.0-1/doxygen-awesome-darkmode-toggle.js"></script>
<script type="text/javascript">
DoxygenAwesomeDarkModeToggle.init()
</script>
<script type="text/javascript" src="../../clipboard.js"></script>
<link href="../../navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../navtreedata.js"></script>
<script type="text/javascript" src="../../navtree.js"></script>
<script type="text/javascript" src="../../cookie.js"></script>
<link href="../../search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../../search/searchdata.js"></script>
<script type="text/javascript" src="../../search/search.js"></script>
<script type="text/javascript">
window.MathJax = {
options: {
ignoreHtmlClass: 'tex2jax_ignore',
processHtmlClass: 'tex2jax_process'
},
loader: {
load: ['[tex]/ams']
},
tex: {
macros: {},
packages: ['base','configmacros','ams']
}
};
</script>
<script type="text/javascript" id="MathJax-script" async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>
<link href="../../doxygen.css" rel="stylesheet" type="text/css" />
<link href="../../doxygen-awesome.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="../../project_logo.png"/></td>
<td id="projectalign">
<div id="projectname">TheAlgorithms/C++<span id="projectnumber">&#160;1.0.0</span>
</div>
<div id="projectbrief">All the algorithms implemented in C++</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.14.0 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "../../search/",'.html');
</script>
<script type="text/javascript">
$(function() { codefold.init(); });
</script>
<script type="text/javascript" src="../../menudata.js"></script>
<script type="text/javascript" src="../../menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('../../',true,false,'search.php','Search',true);
$(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
$(function(){initNavTree('d1/d9a/hopcroft__karp_8cpp_source.html','../../',''); });
</script>
<div id="container">
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">hopcroft_karp.cpp</div></div>
</div><!--header-->
<div class="contents">
<a href="../../d1/d9a/hopcroft__karp_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span></div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> </div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> </div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="preprocessor">#include &lt;iostream&gt;</span></div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="preprocessor">#include &lt;cstdlib&gt;</span> </div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="preprocessor">#include &lt;queue&gt;</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="preprocessor">#include &lt;list&gt;</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="preprocessor">#include &lt;climits&gt;</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="preprocessor">#include &lt;memory&gt;</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="preprocessor">#include &lt;cassert&gt;</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keyword">namespace </span><a class="code hl_namespace" href="../../df/dce/namespacegraph.html">graph</a> { </div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span></div>
<div class="foldopen" id="foldopen00066" data-start="{" data-end="};">
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"><a class="line" href="../../d8/d69/classgraph_1_1_h_k_graph.html"> 66</a></span><span class="keyword">class </span><a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#af02b0c83911070ac6d95fc9905e58aa9">HKGraph</a></div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span>{</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"><a class="line" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3d9101e3b4598159005fd028b9b0ff74"> 68</a></span> <span class="keywordtype">int</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3d9101e3b4598159005fd028b9b0ff74">m</a>{}; </div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"><a class="line" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6f5a9fdbb83ef731d739ba6707e21c3c"> 69</a></span> <span class="keywordtype">int</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6f5a9fdbb83ef731d739ba6707e21c3c">n</a>{}; </div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="keyword">const</span> <span class="keywordtype">int</span> NIL{0};</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="../../d7/d07/bidirectional__dijkstra_8cpp.html#a330a2b0a904f01802ada1f8f3b28e76c">INF</a>{INT_MAX};</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> </div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"><a class="line" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a35893def7a1c5cd60907b4893117796f"> 73</a></span> std::vector&lt;std::list&lt;int&gt; &gt;<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a35893def7a1c5cd60907b4893117796f">adj</a>; </div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> </div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"><a class="line" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a86ebff8a70cbfedd05281993d5d1987b"> 75</a></span> std::vector&lt;int&gt; <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a86ebff8a70cbfedd05281993d5d1987b">pair_u</a>; </div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"><a class="line" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a976ee239402cc2726a280e781c706d77"> 76</a></span> std::vector&lt;int&gt; <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a976ee239402cc2726a280e781c706d77">pair_v</a>; </div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"><a class="line" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a"> 77</a></span> std::vector&lt;int&gt; <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a>; </div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> </div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"><a class="line" href="../../d8/d69/classgraph_1_1_h_k_graph.html#af02b0c83911070ac6d95fc9905e58aa9"> 80</a></span> <a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#af02b0c83911070ac6d95fc9905e58aa9">HKGraph</a>(); <span class="comment">// Default Constructor</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#af02b0c83911070ac6d95fc9905e58aa9">HKGraph</a>(<span class="keywordtype">int</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3d9101e3b4598159005fd028b9b0ff74">m</a>, <span class="keywordtype">int</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6f5a9fdbb83ef731d739ba6707e21c3c">n</a>); <span class="comment">// Constructor</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <span class="keywordtype">void</span> <a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">addEdge</a>(<span class="keywordtype">int</span> u, <span class="keywordtype">int</span> v); <span class="comment">// To add edge</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> </div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <span class="keywordtype">bool</span> <a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a7491add14d9fc04f679114ca6d6f0f93">bfs</a>(); <span class="comment">// Returns true if there is an augmenting path </span></div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="keywordtype">bool</span> <a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#ae794950cb3407b6b47d3dc986cf714c0">dfs</a>(<span class="keywordtype">int</span> u); <span class="comment">// Adds augmenting path if there is one beginning with u </span></div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> </div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> <span class="keywordtype">int</span> <a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a9dbda80d02bdc26c3e8ff7330c9be75d">hopcroftKarpAlgorithm</a>(); <span class="comment">// Returns size of maximum matching</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span>};</div>
</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> </div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span></div>
<div class="foldopen" id="foldopen00095" data-start="{" data-end="}">
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"><a class="line" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a9dbda80d02bdc26c3e8ff7330c9be75d"> 95</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a9dbda80d02bdc26c3e8ff7330c9be75d">HKGraph::hopcroftKarpAlgorithm</a>()</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span>{</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> </div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <span class="comment">// pair_u[u] stores pair of u in matching on left side of Bipartite Graph.</span></div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <span class="comment">// If u doesn&#39;t have any pair, then pair_u[u] is NIL</span></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a86ebff8a70cbfedd05281993d5d1987b">pair_u</a> = std::vector&lt;int&gt;(<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3d9101e3b4598159005fd028b9b0ff74">m</a> + 1,NIL); </div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> </div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> <span class="comment">// pair_v[v] stores pair of v in matching on right side of Biparite Graph.</span></div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> <span class="comment">// If v doesn&#39;t have any pair, then pair_u[v] is NIL</span></div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a976ee239402cc2726a280e781c706d77">pair_v</a> = std::vector&lt;int&gt;(<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6f5a9fdbb83ef731d739ba6707e21c3c">n</a> + 1,NIL); </div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> </div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a> = std::vector&lt;int&gt;(<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3d9101e3b4598159005fd028b9b0ff74">m</a> + 1); <span class="comment">// dist[u] stores distance of left side vertices</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> </div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <span class="keywordtype">int</span> result = 0; <span class="comment">// Initialize result</span></div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> </div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> <span class="comment">// Keep updating the result while there is an augmenting path possible.</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> <span class="keywordflow">while</span> (<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a7491add14d9fc04f679114ca6d6f0f93">bfs</a>())</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> {</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="comment">// Find a free vertex to check for a matching</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> u = 1; u &lt;= <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3d9101e3b4598159005fd028b9b0ff74">m</a>; u++){</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> </div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> <span class="comment">// If current vertex is free and there is</span></div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <span class="comment">// an augmenting path from current vertex</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> <span class="comment">// then increment the result</span></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a86ebff8a70cbfedd05281993d5d1987b">pair_u</a>[u] == NIL &amp;&amp; <a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#ae794950cb3407b6b47d3dc986cf714c0">dfs</a>(u)){</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> result++;</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> }</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> }</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> }</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span>}</div>
</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> </div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span></div>
<div class="foldopen" id="foldopen00133" data-start="{" data-end="}">
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"><a class="line" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a7491add14d9fc04f679114ca6d6f0f93"> 133</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a7491add14d9fc04f679114ca6d6f0f93">HKGraph::bfs</a>()</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span>{</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> std::queue&lt;int&gt; q; <span class="comment">// an integer queue for bfs</span></div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> </div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> <span class="comment">// First layer of vertices (set distance as 0)</span></div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> u = 1; u &lt;= <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3d9101e3b4598159005fd028b9b0ff74">m</a>; u++)</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> {</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="comment">// If this is a free vertex, add it to queue</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a86ebff8a70cbfedd05281993d5d1987b">pair_u</a>[u] == NIL){</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> </div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a>[u] = 0; <span class="comment">// u is not matched so distance is 0</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> q.push(u);</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> }</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> </div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> <span class="keywordflow">else</span>{</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a>[u] = INF; <span class="comment">// set distance as infinite so that this vertex is considered next time for availibility</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> }</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> }</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> </div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> </div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a>[NIL] = INF; <span class="comment">// Initialize distance to NIL as infinite</span></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> </div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="comment">// q is going to contain vertices of left side only.</span></div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keywordflow">while</span> (!q.empty())</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> {</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keywordtype">int</span> u = q.front(); <span class="comment">// dequeue a vertex</span></div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> q.pop();</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> </div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <span class="comment">// If this node is not NIL and can provide a shorter path to NIL then</span></div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a>[u] &lt; <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a>[NIL])</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> {</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> <span class="comment">// Get all the adjacent vertices of the dequeued vertex u</span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> std::list&lt;int&gt;::iterator it;</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> <span class="keywordflow">for</span> (it = <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a35893def7a1c5cd60907b4893117796f">adj</a>[u].begin(); it != <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a35893def7a1c5cd60907b4893117796f">adj</a>[u].end(); ++it)</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> {</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> <span class="keywordtype">int</span> v = *it;</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> </div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> <span class="comment">// If pair of v is not considered so far i.e. (v, pair_v[v]) is not yet explored edge.</span></div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a>[<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a976ee239402cc2726a280e781c706d77">pair_v</a>[v]] == INF)</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> {</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a>[<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a976ee239402cc2726a280e781c706d77">pair_v</a>[v]] = <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a>[u] + 1; </div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> q.push(<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a976ee239402cc2726a280e781c706d77">pair_v</a>[v]); <span class="comment">// Consider the pair and push it to queue</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> }</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> }</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> }</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> }</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> </div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> </div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> </div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> <span class="keywordflow">return</span> (<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a>[NIL] != INF); <span class="comment">// If we could come back to NIL using alternating path of distinct vertices then there is an augmenting path available</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span>}</div>
</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span></div>
<div class="foldopen" id="foldopen00191" data-start="{" data-end="}">
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"><a class="line" href="../../d8/d69/classgraph_1_1_h_k_graph.html#ae794950cb3407b6b47d3dc986cf714c0"> 191</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#ae794950cb3407b6b47d3dc986cf714c0">HKGraph::dfs</a>(<span class="keywordtype">int</span> u)</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span>{</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> <span class="keywordflow">if</span> (u != NIL)</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> {</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> std::list&lt;int&gt;::iterator it;</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> <span class="keywordflow">for</span> (it = <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a35893def7a1c5cd60907b4893117796f">adj</a>[u].begin(); it != <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a35893def7a1c5cd60907b4893117796f">adj</a>[u].end(); ++it)</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> {</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> </div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="keywordtype">int</span> v = *it; <span class="comment">// Adjacent vertex of u</span></div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> </div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> <span class="comment">// Follow the distances set by BFS search</span></div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a>[<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a976ee239402cc2726a280e781c706d77">pair_v</a>[v]] == <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a>[u] + 1)</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> {</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="comment">// If dfs for pair of v also return true then new matching possible, store the matching</span></div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#ae794950cb3407b6b47d3dc986cf714c0">dfs</a>(<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a976ee239402cc2726a280e781c706d77">pair_v</a>[v]) == <span class="keyword">true</span>)</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> { </div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a976ee239402cc2726a280e781c706d77">pair_v</a>[v] = u;</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a86ebff8a70cbfedd05281993d5d1987b">pair_u</a>[u] = v;</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> }</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> }</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> }</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> </div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> </div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">dist</a>[u] = INF; <span class="comment">// If there is no augmenting path beginning with u then set distance to infinite.</span></div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> }</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span>}</div>
</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span></div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span><a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#af02b0c83911070ac6d95fc9905e58aa9">HKGraph::HKGraph</a>() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span></div>
<div class="foldopen" id="foldopen00231" data-start="{" data-end="}">
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"><a class="line" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a0da5aa674d3b3e54a38251ee60d7cd64"> 231</a></span><a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#af02b0c83911070ac6d95fc9905e58aa9">HKGraph::HKGraph</a>(<span class="keywordtype">int</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3d9101e3b4598159005fd028b9b0ff74">m</a>, <span class="keywordtype">int</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6f5a9fdbb83ef731d739ba6707e21c3c">n</a>) {</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> this-&gt;m = <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3d9101e3b4598159005fd028b9b0ff74">m</a>;</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> this-&gt;n = <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6f5a9fdbb83ef731d739ba6707e21c3c">n</a>;</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a35893def7a1c5cd60907b4893117796f">adj</a> = std::vector&lt;std::list&lt;int&gt; &gt;(<a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3d9101e3b4598159005fd028b9b0ff74">m</a> + 1);</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span>}</div>
</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span></div>
<div class="foldopen" id="foldopen00242" data-start="{" data-end="}">
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"><a class="line" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a"> 242</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">HKGraph::addEdge</a>(<span class="keywordtype">int</span> u, <span class="keywordtype">int</span> v)</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span>{</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> <a class="code hl_variable" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a35893def7a1c5cd60907b4893117796f">adj</a>[u].push_back(v); <span class="comment">// Add v to us list.</span></div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span>}</div>
</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> </div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span>} <span class="comment">// namespace graph</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> </div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span><span class="keyword">using </span><a class="code hl_class" href="../../d8/d69/classgraph_1_1_h_k_graph.html">graph::HKGraph</a>;</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span></div>
<div class="foldopen" id="foldopen00255" data-start="{" data-end="}">
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"><a class="line" href="../../d1/d9a/hopcroft__karp_8cpp.html#a88ec9ad42717780d6caaff9d3d6977f9"> 255</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="../../d1/d9a/hopcroft__karp_8cpp.html#a88ec9ad42717780d6caaff9d3d6977f9">tests</a>(){</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="comment">// Sample test case 1</span></div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> <span class="keywordtype">int</span> v1a = 3, v1b = 5; <span class="comment">// vertices of left side, right side and edges</span></div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <a class="code hl_class" href="../../d8/d69/classgraph_1_1_h_k_graph.html">HKGraph</a> g1(v1a, v1b); <span class="comment">// execute the algorithm </span></div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> </div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> g1.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">addEdge</a>(0,1);</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> g1.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">addEdge</a>(1,4);</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> </div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> <span class="keywordtype">int</span> expected_res1 = 0; <span class="comment">// for the above sample data, this is the expected output</span></div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> <span class="keywordtype">int</span> res1 = g1.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a9dbda80d02bdc26c3e8ff7330c9be75d">hopcroftKarpAlgorithm</a>();</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> </div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> assert(res1 == expected_res1); <span class="comment">// assert check to ensure that the algorithm executed correctly for test 1</span></div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> </div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> <span class="comment">// Sample test case 2</span></div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> <span class="keywordtype">int</span> v2a = 4, v2b = 4; <span class="comment">// vertices of left side, right side and edges</span></div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> <a class="code hl_class" href="../../d8/d69/classgraph_1_1_h_k_graph.html">HKGraph</a> g2(v2a, v2b); <span class="comment">// execute the algorithm </span></div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> </div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> g2.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">addEdge</a>(1,1);</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> g2.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">addEdge</a>(1,3);</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> g2.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">addEdge</a>(2,3);</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> g2.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">addEdge</a>(3,4);</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> g2.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">addEdge</a>(4,3);</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> g2.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">addEdge</a>(4,2);</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> </div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <span class="keywordtype">int</span> expected_res2 = 0; <span class="comment">// for the above sample data, this is the expected output</span></div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> <span class="keywordtype">int</span> res2 = g2.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a9dbda80d02bdc26c3e8ff7330c9be75d">hopcroftKarpAlgorithm</a>();</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> </div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> assert(res2 == expected_res2); <span class="comment">// assert check to ensure that the algorithm executed correctly for test 2</span></div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> </div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> <span class="comment">// Sample test case 3</span></div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> <span class="keywordtype">int</span> v3a = 6, v3b = 6; <span class="comment">// vertices of left side, right side and edges</span></div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> <a class="code hl_class" href="../../d8/d69/classgraph_1_1_h_k_graph.html">HKGraph</a> g3(v3a, v3b); <span class="comment">// execute the algorithm </span></div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> </div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> g3.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">addEdge</a>(0,1);</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> g3.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">addEdge</a>(1,4);</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> g3.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">addEdge</a>(1,5);</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> g3.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">addEdge</a>(5,0);</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> </div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> <span class="keywordtype">int</span> expected_res3 = 0; <span class="comment">// for the above sample data, this is the expected output</span></div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> <span class="keywordtype">int</span> res3 = g3.<a class="code hl_function" href="../../d8/d69/classgraph_1_1_h_k_graph.html#a9dbda80d02bdc26c3e8ff7330c9be75d">hopcroftKarpAlgorithm</a>();</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> </div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> assert(res3 == expected_res3); <span class="comment">// assert check to ensure that the algorithm executed correctly for test 3</span></div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> </div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> </div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> </div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span>}</div>
</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span></div>
<div class="foldopen" id="foldopen00306" data-start="{" data-end="}">
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"><a class="line" href="../../d1/d9a/hopcroft__karp_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4"> 306</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="../../d1/d9a/hopcroft__karp_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">main</a>()</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span>{</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> <a class="code hl_function" href="../../d1/d9a/hopcroft__karp_8cpp.html#a88ec9ad42717780d6caaff9d3d6977f9">tests</a>(); <span class="comment">// perform self-tests</span></div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> </div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> <span class="keywordtype">int</span> v1 = 0, v2 = 0, e = 0;</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> std::cin &gt;&gt; v1 &gt;&gt; v2 &gt;&gt; e; <span class="comment">// vertices of left side, right side and edges</span></div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> <a class="code hl_class" href="../../d8/d69/classgraph_1_1_h_k_graph.html">HKGraph</a> g(v1, v2); </div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="keywordtype">int</span> u = 0, v = 0;</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; e; ++i)</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> {</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> std::cin &gt;&gt; u &gt;&gt; v;</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> g.addEdge(u, v);</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> }</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> </div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> <span class="keywordtype">int</span> res = g.hopcroftKarpAlgorithm();</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> std::cout &lt;&lt; <span class="stringliteral">&quot;Maximum matching is &quot;</span> &lt;&lt; res &lt;&lt;<span class="stringliteral">&quot;\n&quot;</span>;</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> </div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> </div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span>}</div>
</div>
<div class="ttc" id="abidirectional__dijkstra_8cpp_html_a330a2b0a904f01802ada1f8f3b28e76c"><div class="ttname"><a href="../../d7/d07/bidirectional__dijkstra_8cpp.html#a330a2b0a904f01802ada1f8f3b28e76c">INF</a></div><div class="ttdeci">constexpr int64_t INF</div><div class="ttdoc">for assert</div><div class="ttdef"><b>Definition</b> <a href="../../d7/d07/bidirectional__dijkstra_8cpp_source.html#l00024">bidirectional_dijkstra.cpp:24</a></div></div>
<div class="ttc" id="aclassgraph_1_1_h_k_graph_html"><div class="ttname"><a href="../../d8/d69/classgraph_1_1_h_k_graph.html">graph::HKGraph</a></div><div class="ttdoc">Represents Bipartite graph for Hopcroft Karp implementation.</div><div class="ttdef"><b>Definition</b> <a href="#l00066">hopcroft_karp.cpp:67</a></div></div>
<div class="ttc" id="aclassgraph_1_1_h_k_graph_html_a35893def7a1c5cd60907b4893117796f"><div class="ttname"><a href="../../d8/d69/classgraph_1_1_h_k_graph.html#a35893def7a1c5cd60907b4893117796f">graph::HKGraph::adj</a></div><div class="ttdeci">std::vector&lt; std::list&lt; int &gt; &gt; adj</div><div class="ttdoc">adj[u] stores adjacents of left side and 0 is used for dummy vertex</div><div class="ttdef"><b>Definition</b> <a href="#l00073">hopcroft_karp.cpp:73</a></div></div>
<div class="ttc" id="aclassgraph_1_1_h_k_graph_html_a3b49011c09cf90a116ab53bef61cd95a"><div class="ttname"><a href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3b49011c09cf90a116ab53bef61cd95a">graph::HKGraph::addEdge</a></div><div class="ttdeci">void addEdge(int u, int v)</div><div class="ttdoc">function to add edge from u to v</div><div class="ttdef"><b>Definition</b> <a href="#l00242">hopcroft_karp.cpp:242</a></div></div>
<div class="ttc" id="aclassgraph_1_1_h_k_graph_html_a3d9101e3b4598159005fd028b9b0ff74"><div class="ttname"><a href="../../d8/d69/classgraph_1_1_h_k_graph.html#a3d9101e3b4598159005fd028b9b0ff74">graph::HKGraph::m</a></div><div class="ttdeci">int m</div><div class="ttdoc">m is the number of vertices on left side of Bipartite Graph</div><div class="ttdef"><b>Definition</b> <a href="#l00068">hopcroft_karp.cpp:68</a></div></div>
<div class="ttc" id="aclassgraph_1_1_h_k_graph_html_a6a0228bbba3818447fcf6b56128b552a"><div class="ttname"><a href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6a0228bbba3818447fcf6b56128b552a">graph::HKGraph::dist</a></div><div class="ttdeci">std::vector&lt; int &gt; dist</div><div class="ttdoc">dist represents the distance between vertex &#39;u&#39; and vertex &#39;v&#39;</div><div class="ttdef"><b>Definition</b> <a href="#l00077">hopcroft_karp.cpp:77</a></div></div>
<div class="ttc" id="aclassgraph_1_1_h_k_graph_html_a6f5a9fdbb83ef731d739ba6707e21c3c"><div class="ttname"><a href="../../d8/d69/classgraph_1_1_h_k_graph.html#a6f5a9fdbb83ef731d739ba6707e21c3c">graph::HKGraph::n</a></div><div class="ttdeci">int n</div><div class="ttdoc">n is the number of vertices on right side of Bipartite Graph</div><div class="ttdef"><b>Definition</b> <a href="#l00069">hopcroft_karp.cpp:69</a></div></div>
<div class="ttc" id="aclassgraph_1_1_h_k_graph_html_a7491add14d9fc04f679114ca6d6f0f93"><div class="ttname"><a href="../../d8/d69/classgraph_1_1_h_k_graph.html#a7491add14d9fc04f679114ca6d6f0f93">graph::HKGraph::bfs</a></div><div class="ttdeci">bool bfs()</div><div class="ttdoc">This function checks for the possibility of augmented path availability.</div><div class="ttdef"><b>Definition</b> <a href="#l00133">hopcroft_karp.cpp:133</a></div></div>
<div class="ttc" id="aclassgraph_1_1_h_k_graph_html_a86ebff8a70cbfedd05281993d5d1987b"><div class="ttname"><a href="../../d8/d69/classgraph_1_1_h_k_graph.html#a86ebff8a70cbfedd05281993d5d1987b">graph::HKGraph::pair_u</a></div><div class="ttdeci">std::vector&lt; int &gt; pair_u</div><div class="ttdoc">value of vertex &#39;u&#39; ranges from 1 to m</div><div class="ttdef"><b>Definition</b> <a href="#l00075">hopcroft_karp.cpp:75</a></div></div>
<div class="ttc" id="aclassgraph_1_1_h_k_graph_html_a976ee239402cc2726a280e781c706d77"><div class="ttname"><a href="../../d8/d69/classgraph_1_1_h_k_graph.html#a976ee239402cc2726a280e781c706d77">graph::HKGraph::pair_v</a></div><div class="ttdeci">std::vector&lt; int &gt; pair_v</div><div class="ttdoc">value of vertex &#39;v&#39; ranges from 1 to n</div><div class="ttdef"><b>Definition</b> <a href="#l00076">hopcroft_karp.cpp:76</a></div></div>
<div class="ttc" id="aclassgraph_1_1_h_k_graph_html_a9dbda80d02bdc26c3e8ff7330c9be75d"><div class="ttname"><a href="../../d8/d69/classgraph_1_1_h_k_graph.html#a9dbda80d02bdc26c3e8ff7330c9be75d">graph::HKGraph::hopcroftKarpAlgorithm</a></div><div class="ttdeci">int hopcroftKarpAlgorithm()</div><div class="ttdoc">This function counts the number of augmenting paths between left and right sides of the Bipartite gra...</div><div class="ttdef"><b>Definition</b> <a href="#l00095">hopcroft_karp.cpp:95</a></div></div>
<div class="ttc" id="aclassgraph_1_1_h_k_graph_html_ae794950cb3407b6b47d3dc986cf714c0"><div class="ttname"><a href="../../d8/d69/classgraph_1_1_h_k_graph.html#ae794950cb3407b6b47d3dc986cf714c0">graph::HKGraph::dfs</a></div><div class="ttdeci">bool dfs(int u)</div><div class="ttdoc">This functions checks whether an augmenting path is available exists beginning with free vertex u.</div><div class="ttdef"><b>Definition</b> <a href="#l00191">hopcroft_karp.cpp:191</a></div></div>
<div class="ttc" id="aclassgraph_1_1_h_k_graph_html_af02b0c83911070ac6d95fc9905e58aa9"><div class="ttname"><a href="../../d8/d69/classgraph_1_1_h_k_graph.html#af02b0c83911070ac6d95fc9905e58aa9">graph::HKGraph::HKGraph</a></div><div class="ttdeci">HKGraph()</div><div class="ttdoc">Default Constructor for initialization.</div></div>
<div class="ttc" id="ahopcroft__karp_8cpp_html_a88ec9ad42717780d6caaff9d3d6977f9"><div class="ttname"><a href="../../d1/d9a/hopcroft__karp_8cpp.html#a88ec9ad42717780d6caaff9d3d6977f9">tests</a></div><div class="ttdeci">void tests()</div><div class="ttdef"><b>Definition</b> <a href="#l00255">hopcroft_karp.cpp:255</a></div></div>
<div class="ttc" id="ahopcroft__karp_8cpp_html_ae66f6b31b5ad750f1fe042a706a4e3d4"><div class="ttname"><a href="../../d1/d9a/hopcroft__karp_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">main</a></div><div class="ttdeci">int main()</div><div class="ttdoc">Main function.</div><div class="ttdef"><b>Definition</b> <a href="#l00306">hopcroft_karp.cpp:306</a></div></div>
<div class="ttc" id="anamespacegraph_html"><div class="ttname"><a href="../../df/dce/namespacegraph.html">graph</a></div><div class="ttdoc">Graph Algorithms.</div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
</div><!-- container -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a href="../../dir_12552d7fa429bf94a2e32e5cf39f7e69.html">graph</a></li><li class="navelem"><a href="../../d1/d9a/hopcroft__karp_8cpp.html">hopcroft_karp.cpp</a></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="../../doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.14.0 </li>
</ul>
</div>
</body>
</html>