Added docs

This commit is contained in:
Ayaan Khan 2020-06-25 04:13:49 +05:30
parent f1ab19bb33
commit e6ab38c2fd

View File

@ -1,29 +1,86 @@
/**
*
* \file
* \brief [Connected Components
* (Connected Components)](https://en.wikipedia.org/wiki/Component_(graph_theory))
*
* \author [Ayaan Khan](http://github.com/ayaankhan98)
*
* \details
* A graph is a collection of nodes also called vertices and these vertices
* are connected by edges. A connected component in a graph refers to a set of
* vertices which are reachable form one another.
*
* Example - Here is graph with 3 connected components
*
* 3 9 6 8
* / \ / / \ / \
* 2---4 2 7 3 7
*
* first second third
* component component component
*
*/
#include <algorithm>
#include <iostream> #include <iostream>
#include <vector> #include <vector>
using std::vector; using std::vector;
/**
* Class for representing graph as a adjacency list.
*/
class graph { class graph {
private: private:
/** \brief adj stores adjacency list representation of graph */
vector<vector<int>> adj; vector<vector<int>> adj;
/** \brief keep track of connected components */
int connected_components; int connected_components;
/** \brief Utility function to perform depth first search on graph */
void depth_first_search(); void depth_first_search();
/** \brief Utility function that explores given vertex in graph */
void explore(int, vector<bool> &); void explore(int, vector<bool> &);
public: public:
/**
* \brief Constructor that intiliazes the graph on creation and set
* the connected components to 0
*/
explicit graph(int n) : adj(n, vector<int>()) { connected_components = 0; } explicit graph(int n) : adj(n, vector<int>()) { connected_components = 0; }
/** \brief Function to add a edge between two nodes or vertices of graph */
void addEdge(int, int); void addEdge(int, int);
/**
* \brief Function the calculates the connected compoents in the graph
* by performing the depth first search on graph
*
* @return connected_components total connected components in graph
*/
int getConnectedComponents() { int getConnectedComponents() {
depth_first_search(); depth_first_search();
return connected_components; return connected_components;
} }
}; };
/**
* \brief Function that add edge between two nodes or vertices of graph
*
* @param u any node or vertex of graph
* @param v any node or vertex of graph
*/
void graph::addEdge(int u, int v) { void graph::addEdge(int u, int v) {
adj[u - 1].push_back(v - 1); adj[u - 1].push_back(v - 1);
adj[v - 1].push_back(u - 1); adj[v - 1].push_back(u - 1);
} }
/**
* \brief Function that perfoms depth first search algorithm on graph
*/
void graph::depth_first_search() { void graph::depth_first_search() {
int n = adj.size(); int n = adj.size();
vector<bool> visited(n, false); vector<bool> visited(n, false);
@ -35,7 +92,13 @@ void graph::depth_first_search() {
} }
} }
} }
/**
* \brief Utility function for depth first seach algorithm
* this function explores the vertex which is passed into.
*
* @param u vertex or node to be explored
* @param visited already visited vertex
*/
void graph::explore(int u, vector<bool> &visited) { void graph::explore(int u, vector<bool> &visited) {
visited[u] = true; visited[u] = true;
for (auto v : adj[u]) { for (auto v : adj[u]) {
@ -45,10 +108,16 @@ void graph::explore(int u, vector<bool> &visited) {
} }
} }
/** Main function */
int main() { int main() {
/// creating a graph with 4 vertex
graph g(4); graph g(4);
/// Adding edges between vertices
g.addEdge(1, 2); g.addEdge(1, 2);
g.addEdge(3, 2); g.addEdge(3, 2);
/// printing the connected components
std::cout << g.getConnectedComponents(); std::cout << g.getConnectedComponents();
return 0; return 0;
} }