TheAlgorithms/C++ 1.0.0
All the algorithms implemented in C++
Loading...
Searching...
No Matches
graph::HKGraph Class Reference

Represents Bipartite graph for Hopcroft Karp implementation. More...

Collaboration diagram for graph::HKGraph:
[legend]

Public Member Functions

 HKGraph ()
 Default Constructor for initialization.
 
 HKGraph (int m, int n)
 Constructor for initialization.
 
void addEdge (int u, int v)
 function to add edge from u to v
 
bool bfs ()
 This function checks for the possibility of augmented path availability.
 
bool dfs (int u)
 This functions checks whether an augmenting path is available exists beginning with free vertex u.
 
int hopcroftKarpAlgorithm ()
 This function counts the number of augmenting paths between left and right sides of the Bipartite graph.
 

Private Attributes

int m {}
 m is the number of vertices on left side of Bipartite Graph
 
int n {}
 n is the number of vertices on right side of Bipartite Graph
 
const int NIL {0}
 
const int INF {INT_MAX}
 
std::vector< std::list< int > > adj
 adj[u] stores adjacents of left side and 0 is used for dummy vertex
 
std::vector< int > pair_u
 value of vertex 'u' ranges from 1 to m
 
std::vector< int > pair_v
 value of vertex 'v' ranges from 1 to n
 
std::vector< int > dist
 dist represents the distance between vertex 'u' and vertex 'v'
 

Detailed Description

Represents Bipartite graph for Hopcroft Karp implementation.

Definition at line 66 of file hopcroft_karp.cpp.

Constructor & Destructor Documentation

◆ HKGraph()

graph::HKGraph::HKGraph ( int m,
int n )

Constructor for initialization.

Parameters
mis the number of vertices on left side of Bipartite Graph
nis the number of vertices on right side of Bipartite Graph

Definition at line 231 of file hopcroft_karp.cpp.

231 {
232 this->m = m;
233 this->n = n;
234 adj = std::vector<std::list<int> >(m + 1);
235}
std::vector< std::list< int > > adj
adj[u] stores adjacents of left side and 0 is used for dummy vertex
int m
m is the number of vertices on left side of Bipartite Graph
int n
n is the number of vertices on right side of Bipartite Graph

Member Function Documentation

◆ addEdge()

void graph::HKGraph::addEdge ( int u,
int v )

function to add edge from u to v

Parameters
uis the position of first vertex
vis the position of second vertex

Definition at line 242 of file hopcroft_karp.cpp.

243{
244 adj[u].push_back(v); // Add v to u’s list.
245}

◆ bfs()

bool graph::HKGraph::bfs ( )

This function checks for the possibility of augmented path availability.

Returns
true if there is an augmenting path available
false if there is no augmenting path available

Definition at line 133 of file hopcroft_karp.cpp.

134{
135 std::queue<int> q; // an integer queue for bfs
136
137 // First layer of vertices (set distance as 0)
138 for (int u = 1; u <= m; u++)
139 {
140 // If this is a free vertex, add it to queue
141 if (pair_u[u] == NIL){
142
143 dist[u] = 0; // u is not matched so distance is 0
144 q.push(u);
145 }
146
147 else{
148 dist[u] = INF; // set distance as infinite so that this vertex is considered next time for availibility
149 }
150 }
151
152
153 dist[NIL] = INF; // Initialize distance to NIL as infinite
154
155 // q is going to contain vertices of left side only.
156 while (!q.empty())
157 {
158 int u = q.front(); // dequeue a vertex
159 q.pop();
160
161 // If this node is not NIL and can provide a shorter path to NIL then
162 if (dist[u] < dist[NIL])
163 {
164 // Get all the adjacent vertices of the dequeued vertex u
165 std::list<int>::iterator it;
166 for (it = adj[u].begin(); it != adj[u].end(); ++it)
167 {
168 int v = *it;
169
170 // If pair of v is not considered so far i.e. (v, pair_v[v]) is not yet explored edge.
171 if (dist[pair_v[v]] == INF)
172 {
173 dist[pair_v[v]] = dist[u] + 1;
174 q.push(pair_v[v]); // Consider the pair and push it to queue
175 }
176 }
177 }
178 }
179
180
181
182 return (dist[NIL] != INF); // If we could come back to NIL using alternating path of distinct vertices then there is an augmenting path available
183}
std::vector< int > dist
dist represents the distance between vertex 'u' and vertex 'v'
std::vector< int > pair_u
value of vertex 'u' ranges from 1 to m
std::vector< int > pair_v
value of vertex 'v' ranges from 1 to n

◆ dfs()

bool graph::HKGraph::dfs ( int u)

This functions checks whether an augmenting path is available exists beginning with free vertex u.

Parameters
urepresents position of vertex
Returns
true if there is an augmenting path beginning with free vertex u
false if there is no augmenting path beginning with free vertex u

Definition at line 191 of file hopcroft_karp.cpp.

192{
193 if (u != NIL)
194 {
195 std::list<int>::iterator it;
196 for (it = adj[u].begin(); it != adj[u].end(); ++it)
197 {
198
199 int v = *it; // Adjacent vertex of u
200
201 // Follow the distances set by BFS search
202 if (dist[pair_v[v]] == dist[u] + 1)
203 {
204 // If dfs for pair of v also return true then new matching possible, store the matching
205 if (dfs(pair_v[v]) == true)
206 {
207 pair_v[v] = u;
208 pair_u[u] = v;
209 return true;
210 }
211 }
212 }
213
214
215 dist[u] = INF; // If there is no augmenting path beginning with u then set distance to infinite.
216 return false;
217 }
218 return true;
219}
bool dfs(int u)
This functions checks whether an augmenting path is available exists beginning with free vertex u.

◆ hopcroftKarpAlgorithm()

int graph::HKGraph::hopcroftKarpAlgorithm ( )

This function counts the number of augmenting paths between left and right sides of the Bipartite graph.

Returns
size of maximum matching

Definition at line 95 of file hopcroft_karp.cpp.

96{
97
98 // pair_u[u] stores pair of u in matching on left side of Bipartite Graph.
99 // If u doesn't have any pair, then pair_u[u] is NIL
100 pair_u = std::vector<int>(m + 1,NIL);
101
102 // pair_v[v] stores pair of v in matching on right side of Biparite Graph.
103 // If v doesn't have any pair, then pair_u[v] is NIL
104 pair_v = std::vector<int>(n + 1,NIL);
105
106 dist = std::vector<int>(m + 1); // dist[u] stores distance of left side vertices
107
108 int result = 0; // Initialize result
109
110 // Keep updating the result while there is an augmenting path possible.
111 while (bfs())
112 {
113 // Find a free vertex to check for a matching
114 for (int u = 1; u <= m; u++){
115
116 // If current vertex is free and there is
117 // an augmenting path from current vertex
118 // then increment the result
119 if (pair_u[u] == NIL && dfs(u)){
120 result++;
121 }
122 }
123 }
124 return result;
125}
bool bfs()
This function checks for the possibility of augmented path availability.
uint64_t result(uint64_t n)

Member Data Documentation

◆ adj

std::vector<std::list<int> > graph::HKGraph::adj
private

adj[u] stores adjacents of left side and 0 is used for dummy vertex

Definition at line 73 of file hopcroft_karp.cpp.

◆ dist

std::vector<int> graph::HKGraph::dist
private

dist represents the distance between vertex 'u' and vertex 'v'

Definition at line 77 of file hopcroft_karp.cpp.

◆ INF

const int graph::HKGraph::INF {INT_MAX}
private

Definition at line 71 of file hopcroft_karp.cpp.

71{INT_MAX};

◆ m

int graph::HKGraph::m {}
private

m is the number of vertices on left side of Bipartite Graph

Definition at line 68 of file hopcroft_karp.cpp.

68{};

◆ n

int graph::HKGraph::n {}
private

n is the number of vertices on right side of Bipartite Graph

Definition at line 69 of file hopcroft_karp.cpp.

69{};

◆ NIL

const int graph::HKGraph::NIL {0}
private

Definition at line 70 of file hopcroft_karp.cpp.

70{0};

◆ pair_u

std::vector<int> graph::HKGraph::pair_u
private

value of vertex 'u' ranges from 1 to m

Definition at line 75 of file hopcroft_karp.cpp.

◆ pair_v

std::vector<int> graph::HKGraph::pair_v
private

value of vertex 'v' ranges from 1 to n

Definition at line 76 of file hopcroft_karp.cpp.


The documentation for this class was generated from the following file: