diff --git a/graph/connected_components.cpp b/graph/connected_components.cpp index 0bfb8bbdb..e53dbf424 100644 --- a/graph/connected_components.cpp +++ b/graph/connected_components.cpp @@ -1,29 +1,85 @@ +/** + * + * \file + * \brief [Graph 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 #include #include using std::vector; +/** + * Class for representing graph as a adjacency list. + */ class graph { private: + /** \brief adj stores adjacency list representation of graph */ vector> adj; + + /** \brief keep track of connected components */ int connected_components; + void depth_first_search(); void explore(int, vector &); public: + /** + * \brief Constructor that intiliazes the graph on creation and set + * the connected components to 0 + */ explicit graph(int n) : adj(n, vector()) { connected_components = 0; } + 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() { depth_first_search(); 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) { adj[u - 1].push_back(v - 1); adj[v - 1].push_back(u - 1); } +/** + * \brief Function that perfoms depth first search algorithm on graph + */ void graph::depth_first_search() { int n = adj.size(); vector visited(n, false); @@ -35,7 +91,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 &visited) { visited[u] = true; for (auto v : adj[u]) { @@ -45,10 +107,16 @@ void graph::explore(int u, vector &visited) { } } +/** Main function */ int main() { + /// creating a graph with 4 vertex graph g(4); + + /// Adding edges between vertices g.addEdge(1, 2); g.addEdge(3, 2); + + /// printing the connected components std::cout << g.getConnectedComponents(); return 0; }