{"id":1876,"date":"2020-07-01T09:47:14","date_gmt":"2020-07-01T09:47:14","guid":{"rendered":"https:\/\/blog.prepbytes.com\/?p=1876"},"modified":"2022-03-21T10:44:54","modified_gmt":"2022-03-21T10:44:54","slug":"count-components","status":"publish","type":"post","link":"https:\/\/prepbytes.com\/blog\/count-components\/","title":{"rendered":"Count Components"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1645097779643-Article_294.png\" alt=\"\" \/><\/p>\n<h3>Concepts Used<\/h3>\n<blockquote>\n<p>Depth First Search, Disjoint Set<\/p>\n<\/blockquote>\n<h3>Difficulty Level<\/h3>\n<blockquote>\n<p>Easy<\/p>\n<\/blockquote>\n<h3>Problem Statement :<\/h3>\n<blockquote>\n<p>Given an undirected graph, print Yes if a cycle is present in the graph else print No.<\/p>\n<\/blockquote>\n<p><a href=\"https:\/\/mycode.prepbytes.com\/problems\/graphs\/CONCOM\" title=\"Go to mycode.prepbytes.com\" target=\"_blank\" rel=\"noopener noreferrer\"><u><strong><\/strong><\/u><\/a><\/p>\n<h3>Solution Approach :<\/h3>\n<p><strong>Introduction<\/strong> :<\/p>\n<blockquote>\n<p>By definition,<br \/>\n&quot; Connected components in a graph is a subgraph in which any two vertices are connected to each other by paths, and which is connected to no additional vertices in the supergraph. A vertex with no incident edges is itself a component. A graph that is itself connected has exactly one component, consisting of the whole graph.&quot; <\/p>\n<p>This problem can be solved by many ways like <strong>Breadth First Search<\/strong>, <strong>Depth First Search<\/strong> or <strong>Disjoint Set<\/strong>. Idea is to keep count of the number of connected components. Below we are going to discuss two of the above mentioned methods to solve this problem.<\/p>\n<\/blockquote>\n<p><img decoding=\"async\" src=\"https:\/\/prepbytes.com\/blog\/wp-content\/uploads\/2020\/06\/concom.png\" alt=\"\" \/><\/p>\n<p><strong>Method 1 (Using DFS)<\/strong> :<\/p>\n<blockquote>\n<p>In this method we are going to use <strong>Depth First Search<\/strong> or <strong>DFS<\/strong> to find total number of connected components. In <strong>dfs()<\/strong>, we are going to traverse all the adjacent vertices which are not yet visited and mark them as visited so we won&#8217;t traverse them again. We have to keep count of the different <strong>dfs()<\/strong> calls made for each unvisited vertex and increment count by <code>1<\/code> for each call.<br \/>\nWe can keep track if the node is visited or not, using a boolean <strong>visited[ ]<\/strong> array of size <code>n<\/code> which is initially set false (why <code>?<\/code>).<\/p>\n<p>Now the question arise, why are we counting the different calls made to <strong>dfs()<\/strong> <code>?<\/code> The answer lies in the fact that each time we call our dfs() function with some vertex <code>v<\/code>, it marks all vertices which are connected to <code>v<\/code> as visited, which means the we are visiting the vertices which are directly or indirectly connected to the <code>v<\/code> and by the definition of the <strong>Connected Component<\/strong> above, this is considered as one component. So each call made up to dfs() with some unvisited vertex <code>v<\/code>, gives us the different connected component. <\/p>\n<\/blockquote>\n<p><strong>Method 2 (Using Disjoint Set)<\/strong> :<\/p>\n<blockquote>\n<p><strong>Disjoint Set Union<\/strong> or <strong>DSU<\/strong>  data structure is also sometimes called <strong>Union-Find Set<\/strong>. This data structure is used to keep track of the different disjoint sets.<br \/>\nIt basically performs two operations :<\/p>\n<ol>\n<li><strong>Union :<\/strong> It takes two vertices and join them in a single set (if it is not already there).<\/li>\n<li><strong>Find :<\/strong> Determines in which subset the element is.<\/li>\n<\/ol>\n<p>We will use a <code>parent[]<\/code> array to keep track of the parents of each vertex. <code>ith<\/code> element will store the root\/parent of i<sup>th<\/sup> vertex. Now we will perform <strong>union()<\/strong> for every edge (uv) and update the <code>parent[]<\/code> array.<br \/>\nNow, iterate for all vertices, for each vertex <code>v<\/code>, we will find root of <code>v<\/code> using <strong>find()<\/strong> and keep track of all distinct roots. Every time we encounter a distinct root increment the counter by <code>1<\/code>.<\/p>\n<p>Each disjoint set stores the vertices which are connected (directly or indirectly) to each other and has no relation\/connection with any other vertex (as it is non overlapping set), which means each set itself represents a connected component of the graph and since each set contains exactly one vertex as its root, the sum of distinct roots of all sets gives us the total number of connected components in the graph.<\/p>\n<\/blockquote>\n<h3>Algorithms :<\/h3>\n<p><strong>dfs()<\/strong> :<\/p>\n<blockquote>\n<ol>\n<li>For each call, for some vertex <code>v<\/code> ( dfs(<code>v<\/code>) ), we will mark the vertex <code>v<\/code> as visited (<code>visited[v]= true<\/code>).<\/li>\n<li>Iterate for all the adjacent vertices of <code>v<\/code> and for every adjacent vertex <code>a<\/code>, do following :\n<ul>\n<li>if <code>a<\/code> is not visited i.e <code>visited[a]= false<\/code>, <\/li>\n<li>recursively call <strong>dfs (<code>a<\/code>)<\/strong>.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><strong>union()<\/strong> :<\/p>\n<ol>\n<li>For two vertices <code>u<\/code> &amp; <code>v<\/code>, find the root for both vertices using <strong>find()<\/strong> (<code>a=find(u)<\/code> &amp; <code>b = find(v)<\/code>).<\/li>\n<li>If the root of <code>u<\/code> &amp; <code>v<\/code> are not similar, check the level of <code>a<\/code> &amp; <code>b<\/code> as follows:\n<ul>\n<li>if (<code>level[a]&gt;level[b]<\/code>), update <code>parent[b] = a<\/code>.<\/li>\n<li>else , update <code>parent[b]=a<\/code> &amp; update <code>level[a] = level[a]+1<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><strong>find()<\/strong> : <\/p>\n<ol>\n<li>If <code>(parent[v]==v)<\/code>, returns the vertex <code>v<\/code> (which is root).<\/li>\n<li>Else, update <code>parent[v]<\/code> by recursively looking up the tree for the root. <code>(find(parent[v]))<\/code>.<\/li>\n<\/ol>\n<\/blockquote>\n<h3>Complexity Analysis:<\/h3>\n<blockquote>\n<p>The <strong>time complexity<\/strong> of <strong>Depth First Search<\/strong> is represented in the form of <code>O(V + E)<\/code>, where <code>V<\/code> is the number of nodes and <code>E<\/code> is the number of edges.<\/p>\n<p>The <strong>space complexity<\/strong> of the algorithm is <code>O(V)<\/code> as it requires one array ( visited[ ]) of size <code>V<\/code>.<\/p>\n<p>Talking about <strong>Union-Find<\/strong> data structure, since we have used path compression &amp; union by rank (refer to <strong>Disjoint Set<\/strong> article for more detailed explanation), we will reach nearly constant time <code>O(1)<\/code> for each query. It turns out, that the final amortized time complexity is <code>O(\u03b1(V))<\/code>, where <code>\u03b1(V)<\/code> is the inverse Ackermann function, which grows very slowly <code>(\u03b1(V)&lt;5)<\/code>. In our case a single call might take <code>O(logn)<\/code> in the worst case, but if we do m such calls back to back we will end up with an average time of <code>O(\u03b1(n))<\/code>.<\/p>\n<\/blockquote>\n<h3>Solutions:<\/h3>\n<p>\t\t\t\t\t\t<style>\r\n\t\t\t\t\r\n\t\t\t\t\t#tab_container_1898 {\r\n\toverflow:hidden;\r\n\tdisplay:block;\r\n\twidth:100%;\r\n\tborder:0px solid #ddd;\r\n\tmargin-bottom:30px;\r\n\t}\r\n\r\n#tab_container_1898 .tab-content{\r\n\tpadding:20px;\r\n\tborder: 1px solid #e6e6e6 !important;\r\n\tmargin-top: 0px;\r\n\tbackground-color:#ffffff !important;\r\n\tcolor: #000000 !important;\r\n\tfont-size:16px !important;\r\n\tfont-family: Open Sans !important;\r\n\t\r\n\t\tborder: 1px solid #e6e6e6 !important;\r\n\t}\r\n#tab_container_1898 .wpsm_nav-tabs {\r\n    border-bottom: 0px solid #ddd;\r\n}\r\n#tab_container_1898 .wpsm_nav-tabs > li.active > a, #tab_container_1898 .wpsm_nav-tabs > li.active > a:hover, #tab_container_1898 .wpsm_nav-tabs > li.active > a:focus {\r\n\tcolor: #000000 !important;\r\n\tcursor: default;\r\n\tbackground-color: #ffffff !important;\r\n\tborder: 1px solid #e6e6e6 !important;\r\n}\r\n\r\n#tab_container_1898 .wpsm_nav-tabs > li > a {\r\n    margin-right: 0px !important; \r\n    line-height: 1.42857143 !important;\r\n    border: 1px solid #d5d5d5 !important;\r\n    border-radius: 0px 0px 0 0 !important; \r\n\tbackground-color: #e8e8e8 !important;\r\n\tcolor: #000000 !important;\r\n\tpadding: 15px 18px 15px 18px !important;\r\n\ttext-decoration: none !important;\r\n\tfont-size: 14px !important;\r\n\ttext-align:center !important;\r\n\tfont-family: Open Sans !important;\r\n}\r\n#tab_container_1898 .wpsm_nav-tabs > li > a:focus {\r\noutline: 0px !important;\r\n}\r\n\r\n#tab_container_1898 .wpsm_nav-tabs > li > a:before {\r\n\tdisplay:none !important;\r\n}\r\n#tab_container_1898 .wpsm_nav-tabs > li > a:after {\r\n\tdisplay:none !important ;\r\n}\r\n#tab_container_1898 .wpsm_nav-tabs > li{\r\npadding:0px !important ;\r\nmargin:0px;\r\n}\r\n\r\n#tab_container_1898 .wpsm_nav-tabs > li > a:hover , #tab_container_1898 .wpsm_nav-tabs > li > a:focus {\r\n    color: #000000 !important;\r\n    background-color: #e8e8e8 !important;\r\n\tborder: 1px solid #d5d5d5 !important;\r\n\t\r\n}\r\n#tab_container_1898 .wpsm_nav-tabs > li > a .fa{\r\n\r\nmargin-right:5px !important;\r\n\r\nmargin-left:5px !important;\r\n\r\n\r\n}\r\n\r\n\t\t#tab_container_1898 .wpsm_nav-tabs a{\r\n\t\t\tbackground-image: none;\r\n\t\t\tbackground-position: 0 0;\r\n\t\t\tbackground-repeat: repeat-x;\r\n\t\t}\r\n\t\t\t\r\n\r\n\r\n#tab_container_1898 .wpsm_nav-tabs > li {\r\n    float: left;\r\n    margin-bottom: -1px !important;\r\n\tmargin-right:0px !important; \r\n}\r\n\r\n\r\n#tab_container_1898 .tab-content{\r\noverflow:hidden !important;\r\n}\r\n\r\n\r\n@media (min-width: 769px) {\r\n\r\n\t#tab_container_1898 .wpsm_nav-tabs > li{\r\n\t\tfloat:left !important ;\r\n\t\t\t\tmargin-right:-1px !important;\r\n\t\t\t\t\t}\r\n\t#tab_container_1898 .wpsm_nav-tabs{\r\n\t\tfloat:none !important;\r\n\t\tmargin:0px !important;\r\n\t}\r\n\r\n\t#tab_container_1898 .wpsm_nav-tabs > li {\r\n\t\t\t\t\r\n\t}\r\n\t#tab_container_1898 .wpsm_nav{\r\n\t\t\t}\r\n\r\n}\r\n\r\n\r\n\r\n@media (max-width: 768px) {\r\n\t#tab_container_1898 .wpsm_nav-tabs > li {\r\n\t\t\t\t\r\n\t}\r\n\t#tab_container_1898 .wpsm_nav{\r\n\t\t\t}\r\n}\r\n\r\n\r\n\t.wpsm_nav-tabs li:before{\r\n\t\tdisplay:none !important;\r\n\t}\r\n\r\n\t@media (max-width: 768px) {\r\n\t\t\t\t\r\n\t\t\t\t.wpsm_nav-tabs{\r\n\t\t\tmargin-left:0px !important;\r\n\t\t\tmargin-right:0px !important; \r\n\t\t\t\r\n\t\t}\r\n\t\t\t\t#tab_container_1898 .wpsm_nav-tabs > li{\r\n\t\t\tfloat:none !important;\r\n\t\t}\r\n\t\t\t\r\n\t}\t\t\t\t<\/style>\r\n\t\t\t\t<div id=\"tab_container_1898\" >\r\n\t \r\n\t\t\t\t\t<ul class=\"wpsm_nav wpsm_nav-tabs\" role=\"tablist\" id=\"myTab_1898\">\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t<li role=\"presentation\"  class=\"active\"  onclick=\"do_resize()\">\r\n\t\t\t\t\t\t\t\t<a href=\"#tabs_desc_1898_1\" aria-controls=\"tabs_desc_1898_1\" role=\"tab\" data-toggle=\"tab\">\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-code\"><\/i> \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t<span>C<\/span>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t<\/a>\r\n\t\t\t\t\t\t\t<\/li>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t<li role=\"presentation\"  onclick=\"do_resize()\">\r\n\t\t\t\t\t\t\t\t<a href=\"#tabs_desc_1898_2\" aria-controls=\"tabs_desc_1898_2\" role=\"tab\" data-toggle=\"tab\">\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-code\"><\/i> \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t<span>C++<\/span>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t<\/a>\r\n\t\t\t\t\t\t\t<\/li>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t<li role=\"presentation\"  onclick=\"do_resize()\">\r\n\t\t\t\t\t\t\t\t<a href=\"#tabs_desc_1898_3\" aria-controls=\"tabs_desc_1898_3\" role=\"tab\" data-toggle=\"tab\">\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"fa fa-code\"><\/i> \t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t<span>Java<\/span>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t<\/a>\r\n\t\t\t\t\t\t\t<\/li>\r\n\t\t\t\t\t\t\t\t\t\t\t <\/ul>\r\n\r\n\t\t\t\t\t  <!-- Tab panes -->\r\n\t\t\t\t\t  <div class=\"tab-content\" id=\"tab-content_1898\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t <div role=\"tabpanel\" class=\"tab-pane  in active \" id=\"tabs_desc_1898_1\">\r\n\t\t\t\t\t\t\t\t\r\n<!-- wp:enlighter\/codeblock {\"language\":\"c\"} -->\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\r\n#include<stdio.h>\r\n    #include<stdlib.h>\r\n\r\n    long int findd(long int parent[],int i)\r\n    {\r\n    if(parent[i]==i)\r\n    {\r\n        return i;\r\n    }\r\n\r\n    return parent[i] = findd(parent,parent[i]);\r\n    }\r\n\r\n    void unionn(long int parent[],long int level[],int i,int j)\r\n    {\r\n    long int a = findd(parent,i);\r\n    long int b = findd(parent,j);\r\n\r\n    if(level[a] < level[b])\r\n    parent[a] = b;\r\n    else if(level[a] > level[b])\r\n    parent[b] = a;\r\n    else\r\n    {\r\n        parent[b] = a;\r\n        level[a]++;\r\n    }\r\n    }\r\n\r\n    int main()\r\n    {\r\n    int t;\r\n    scanf(\"%d\",&t);\r\n\r\n    while(t--)\r\n    {\r\n        int n,e;\r\n        scanf(\"%d %d\",&n,&e);\r\n        long int parent[n],level[n],hash[n];\r\n\r\n        for(long int i=0;i<n;i++)\r\n        {\r\n        parent[i]=i;\r\n        level[i]=0;\r\n        hash[i]=0;\r\n        }\r\n        while(e--)\r\n        {\r\n        int u,v;\r\n        scanf(\"%d %d\", &u, &v);\r\n\r\n        unionn(parent,level,u,v);\r\n        }\r\n        for(int i=0;i<n;i++)\r\n        hash[(findd(parent,i))]++;\r\n        int count = 0;\r\n        for(int i=0;i<n;i++)\r\n        {\r\n        if(hash[i]>0)\r\n        count++;\r\n        }\r\n\r\n        printf(\"%d&#92;n\",count);\r\n    }\r\n\r\n    return 0;\r\n    }\r\n<\/pre>\r\n<!-- \/wp:enlighter\/codeblock -->\r\n\r\n\t\t\t\t\t\t <\/div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t <div role=\"tabpanel\" class=\"tab-pane \" id=\"tabs_desc_1898_2\">\r\n\t\t\t\t\t\t\t\t<!-- wp:enlighter\/codeblock {\"language\":\"cpp\"} -->\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\r\n#include &lt;bits\/stdc++.h&gt;\r\n            using namespace std;\r\n\r\n        int findd(long int parent[],int i)\r\n        {\r\n          if(parent[i]==i)\r\n          {\r\n          c++;\r\n          return i;\r\n          }\r\n\r\n          return parent[i] = findd(parent,parent[i]);\r\n        }\r\n\r\n        void unionn(long int parent[],long int level[],int i,int j)\r\n        {\r\n          long int a = findd(parent,i);\r\n          long int b = findd(parent,j);\r\n\r\n          if(level[a] &lt; level[b])\r\n          parent[a] = b;\r\n          else if(level[a] &gt; level[b])\r\n          parent[b] = a;\r\n          else\r\n          {\r\n          parent[b] = a;\r\n          level[a]++;\r\n          }\r\n        }\r\n\r\n        int main()\r\n        {\r\n          int t;\r\n          cin&gt;&gt;t;\r\n\r\n          while(t--)\r\n          {\r\n          int n,e;\r\n          cin&gt;&gt;n&gt;&gt;e;\r\n          long int parent[n],level[n];\r\n\r\n          for(long int i=0;i&lt;n;i++)\r\n          {\r\n          parent[i]=i;\r\n          level[i]=0;\r\n          }\r\n          while(e--)\r\n          {\r\n          int u,v;\r\n          cin&gt;&gt;u&gt;&gt;v;\r\n\r\n          unionn(parent,level,u,v);\r\n          }\r\n          set&lt;long int&gt; s;\r\n          for(int i=0;i&lt;n;i++)\r\n          s.insert(findd(parent,i));\r\n          cout&lt;&lt;s.size()&lt;&lt;endl;\r\n          }\r\n\r\n          return 0;\r\n        }\r\n<\/pre>\r\n<!-- \/wp:enlighter\/codeblock -->\r\n\r\n\t\t\t\t\t\t <\/div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t <div role=\"tabpanel\" class=\"tab-pane \" id=\"tabs_desc_1898_3\">\r\n\t\t\t\t\t\t\t\t<!-- wp:enlighter\/codeblock {\"language\":\"java\"} -->\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\r\n\r\n import java.util.*; \r\n\r\n    class Main { \r\n\r\n    int V; \r\n    LinkedList<Integer>[] adjListArray; \r\n    int c = 0;\r\n\r\n    \/\/ constructor \r\n    Graph(int V) { \r\n        this.V = V; \r\n        \/\/ define the size of array as \r\n        \/\/ number of vertices \r\n        adjListArray = new LinkedList[V]; \r\n\r\n        \/\/ Create a new list for each vertex \r\n        \/\/ such that adjacent nodes can be stored \r\n\r\n        for(int i = 0; i < V ; i++){ \r\n            adjListArray[i] = new LinkedList<Integer>(); \r\n        } \r\n    } \r\n\r\n    \/\/ Adds an edge to an undirected graph \r\n    void addEdge( int src, int dest) { \r\n        \/\/ Add an edge from src to dest. \r\n        adjListArray[src].add(dest); \r\n        adjListArray[dest].add(src); \r\n    } \r\n\r\n    void DFSUtil(int v, boolean[] visited) { \r\n        \/\/ Mark the current node as visited and print it \r\n        visited[v] = true; \r\n        \/\/System.out.print(v+\" \"); \r\n        \/\/ Recur for all the vertices \r\n        \/\/ adjacent to this vertex \r\n        for (int x : adjListArray[v]) { \r\n            if(!visited[x]) DFSUtil(x,visited); \r\n        } \r\n\r\n    } \r\n    int connectedComponents() { \r\n        \/\/ Mark all the vertices as not visited \r\n        boolean[] visited = new boolean[V]; \r\n        for(int v = 0; v < V; ++v) { \r\n            if(!visited[v]) { \r\n                c++;\r\n                DFSUtil(v,visited); \r\n            } \r\n        } \r\n        return c;\r\n    } \r\n\r\n\r\n    public static void main(String[] args){ \r\n        Scanner sc = new Scanner(System.in);\r\n        int t = sc.nextInt();\r\n        while(t-->0)\r\n        {\r\n          int n = sc.nextInt();\r\n          int e = sc.nextInt();\r\n          Graph g = new Graph(n); \r\n          while(e-->0)\r\n          {\r\n            int u = sc.nextInt();\r\n            int v = sc.nextInt();\r\n            g.addEdge(u,v); \r\n          }\r\n\r\n          System.out.println(g.connectedComponents()); \r\n        }\r\n\r\n      } \r\n    }      \r\n<\/pre>\r\n<!-- \/wp:enlighter\/codeblock -->\r\n\t\t\t\t\t\t <\/div>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t <\/div>\r\n\t\t\t\t\t \r\n\t\t\t\t <\/div>\r\n <script>\r\n\t\tjQuery(function () {\r\n\t\t\tjQuery('#myTab_1898 a:first').tab('show')\r\n\t\t});\r\n\t\t\r\n\t\t\t\tjQuery(function(){\r\n\t\t\tvar b=\"fadeIn\";\r\n\t\t\tvar c;\r\n\t\t\tvar a;\r\n\t\t\td(jQuery(\"#myTab_1898 a\"),jQuery(\"#tab-content_1898\"));function d(e,f,g){\r\n\t\t\t\te.click(function(i){\r\n\t\t\t\t\ti.preventDefault();\r\n\t\t\t\t\tjQuery(this).tab(\"show\");\r\n\t\t\t\t\tvar h=jQuery(this).data(\"easein\");\r\n\t\t\t\t\tif(c){c.removeClass(a);}\r\n\t\t\t\t\tif(h){f.find(\"div.active\").addClass(\"animated \"+h);a=h;}\r\n\t\t\t\t\telse{if(g){f.find(\"div.active\").addClass(\"animated \"+g);a=g;}else{f.find(\"div.active\").addClass(\"animated \"+b);a=b;}}c=f.find(\"div.active\");\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\r\n\t\tfunction do_resize(){\r\n\r\n\t\t\tvar width=jQuery( '.tab-content .tab-pane iframe' ).width();\r\n\t\t\tvar height=jQuery( '.tab-content .tab-pane iframe' ).height();\r\n\r\n\t\t\tvar toggleSize = true;\r\n\t\t\tjQuery('iframe').animate({\r\n\t\t\t    width: toggleSize ? width : 640,\r\n\t\t\t    height: toggleSize ? height : 360\r\n\t\t\t  }, 250);\r\n\r\n\t\t\t  toggleSize = !toggleSize;\r\n\t\t}\r\n\r\n\r\n\t<\/script>\r\n\t\t\t\t\r\n\t\t\t<br \/>\n[forminator_quiz id=&quot;1932&quot;]<\/p>\n<p>So, in this blog, we have tried to explain Depth First Search, Disjoint Set. If you want to solve interview coding questions, which are curated by our expert mentors at PrepBytes, you can follow this link <a href=\"https:\/\/mycode.prepbytes.com\/interview-coding\/practice\">interview coding<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Concepts Used Depth First Search, Disjoint Set Difficulty Level Easy Problem Statement : Given an undirected graph, print Yes if a cycle is present in the graph else print No. Solution Approach : Introduction : By definition, &quot; Connected components in a graph is a subgraph in which any two vertices are connected to each [&hellip;]<\/p>\n","protected":false},"author":52,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[114],"tags":[],"class_list":["post-1876","post","type-post","status-publish","format-standard","hentry","category-graphs-interview-questions"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Graphs Interview Questions | Count Components | Prepbytes<\/title>\n<meta name=\"description\" content=\"In This Method We Are Going to Use Depth First Search or Dfs to Find Total Number of Connected Components. in Dfs(), We Are Going to Traverse All the Adjacent Vertices\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/prepbytes.com\/blog\/count-components\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Graphs Interview Questions | Count Components | Prepbytes\" \/>\n<meta property=\"og:description\" content=\"In This Method We Are Going to Use Depth First Search or Dfs to Find Total Number of Connected Components. in Dfs(), We Are Going to Traverse All the Adjacent Vertices\" \/>\n<meta property=\"og:url\" content=\"https:\/\/prepbytes.com\/blog\/count-components\/\" \/>\n<meta property=\"og:site_name\" content=\"PrepBytes Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prepbytes0211\/\" \/>\n<meta property=\"article:published_time\" content=\"2020-07-01T09:47:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-03-21T10:44:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1645097779643-Article_294.png\" \/>\n<meta name=\"author\" content=\"Prepbytes\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Prepbytes\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/prepbytes.com\/blog\/count-components\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/prepbytes.com\/blog\/count-components\/\"},\"author\":{\"name\":\"Prepbytes\",\"@id\":\"http:\/\/43.205.93.38\/#\/schema\/person\/3f7dc4ae851791d5947a7f99df363d5e\"},\"headline\":\"Count Components\",\"datePublished\":\"2020-07-01T09:47:14+00:00\",\"dateModified\":\"2022-03-21T10:44:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/prepbytes.com\/blog\/count-components\/\"},\"wordCount\":793,\"commentCount\":0,\"publisher\":{\"@id\":\"http:\/\/43.205.93.38\/#organization\"},\"image\":{\"@id\":\"https:\/\/prepbytes.com\/blog\/count-components\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1645097779643-Article_294.png\",\"articleSection\":[\"Graphs Interview Questions\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/prepbytes.com\/blog\/count-components\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/prepbytes.com\/blog\/count-components\/\",\"url\":\"https:\/\/prepbytes.com\/blog\/count-components\/\",\"name\":\"Graphs Interview Questions | Count Components | Prepbytes\",\"isPartOf\":{\"@id\":\"http:\/\/43.205.93.38\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/prepbytes.com\/blog\/count-components\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/prepbytes.com\/blog\/count-components\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1645097779643-Article_294.png\",\"datePublished\":\"2020-07-01T09:47:14+00:00\",\"dateModified\":\"2022-03-21T10:44:54+00:00\",\"description\":\"In This Method We Are Going to Use Depth First Search or Dfs to Find Total Number of Connected Components. in Dfs(), We Are Going to Traverse All the Adjacent Vertices\",\"breadcrumb\":{\"@id\":\"https:\/\/prepbytes.com\/blog\/count-components\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/prepbytes.com\/blog\/count-components\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/prepbytes.com\/blog\/count-components\/#primaryimage\",\"url\":\"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1645097779643-Article_294.png\",\"contentUrl\":\"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1645097779643-Article_294.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/prepbytes.com\/blog\/count-components\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"http:\/\/43.205.93.38\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Graphs Interview Questions\",\"item\":\"https:\/\/prepbytes.com\/blog\/category\/graphs-interview-questions\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Count Components\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/43.205.93.38\/#website\",\"url\":\"http:\/\/43.205.93.38\/\",\"name\":\"PrepBytes Blog\",\"description\":\"ONE-STOP RESOURCE FOR EVERYTHING RELATED TO CODING\",\"publisher\":{\"@id\":\"http:\/\/43.205.93.38\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/43.205.93.38\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"http:\/\/43.205.93.38\/#organization\",\"name\":\"Prepbytes\",\"url\":\"http:\/\/43.205.93.38\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\/\/43.205.93.38\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.prepbytes.com\/wp-content\/uploads\/2025\/07\/uzxxllgloialmn9mhwfe.webp\",\"contentUrl\":\"https:\/\/blog.prepbytes.com\/wp-content\/uploads\/2025\/07\/uzxxllgloialmn9mhwfe.webp\",\"width\":160,\"height\":160,\"caption\":\"Prepbytes\"},\"image\":{\"@id\":\"http:\/\/43.205.93.38\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/prepbytes0211\/\",\"https:\/\/www.instagram.com\/prepbytes\/\",\"https:\/\/www.linkedin.com\/company\/prepbytes\/\",\"https:\/\/www.youtube.com\/channel\/UC0xGnHDrjUM1pDEK2Ka5imA\"]},{\"@type\":\"Person\",\"@id\":\"http:\/\/43.205.93.38\/#\/schema\/person\/3f7dc4ae851791d5947a7f99df363d5e\",\"name\":\"Prepbytes\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\/\/43.205.93.38\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/232042cd1a1ea0e982c96d2a2ec93fb70a8e864e00784491231e7bfe5a9e06b5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/232042cd1a1ea0e982c96d2a2ec93fb70a8e864e00784491231e7bfe5a9e06b5?s=96&d=mm&r=g\",\"caption\":\"Prepbytes\"},\"url\":\"https:\/\/prepbytes.com\/blog\/author\/gourav-jaincollegedekho-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Graphs Interview Questions | Count Components | Prepbytes","description":"In This Method We Are Going to Use Depth First Search or Dfs to Find Total Number of Connected Components. in Dfs(), We Are Going to Traverse All the Adjacent Vertices","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/prepbytes.com\/blog\/count-components\/","og_locale":"en_US","og_type":"article","og_title":"Graphs Interview Questions | Count Components | Prepbytes","og_description":"In This Method We Are Going to Use Depth First Search or Dfs to Find Total Number of Connected Components. in Dfs(), We Are Going to Traverse All the Adjacent Vertices","og_url":"https:\/\/prepbytes.com\/blog\/count-components\/","og_site_name":"PrepBytes Blog","article_publisher":"https:\/\/www.facebook.com\/prepbytes0211\/","article_published_time":"2020-07-01T09:47:14+00:00","article_modified_time":"2022-03-21T10:44:54+00:00","og_image":[{"url":"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1645097779643-Article_294.png","type":"","width":"","height":""}],"author":"Prepbytes","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Prepbytes","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/prepbytes.com\/blog\/count-components\/#article","isPartOf":{"@id":"https:\/\/prepbytes.com\/blog\/count-components\/"},"author":{"name":"Prepbytes","@id":"http:\/\/43.205.93.38\/#\/schema\/person\/3f7dc4ae851791d5947a7f99df363d5e"},"headline":"Count Components","datePublished":"2020-07-01T09:47:14+00:00","dateModified":"2022-03-21T10:44:54+00:00","mainEntityOfPage":{"@id":"https:\/\/prepbytes.com\/blog\/count-components\/"},"wordCount":793,"commentCount":0,"publisher":{"@id":"http:\/\/43.205.93.38\/#organization"},"image":{"@id":"https:\/\/prepbytes.com\/blog\/count-components\/#primaryimage"},"thumbnailUrl":"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1645097779643-Article_294.png","articleSection":["Graphs Interview Questions"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/prepbytes.com\/blog\/count-components\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/prepbytes.com\/blog\/count-components\/","url":"https:\/\/prepbytes.com\/blog\/count-components\/","name":"Graphs Interview Questions | Count Components | Prepbytes","isPartOf":{"@id":"http:\/\/43.205.93.38\/#website"},"primaryImageOfPage":{"@id":"https:\/\/prepbytes.com\/blog\/count-components\/#primaryimage"},"image":{"@id":"https:\/\/prepbytes.com\/blog\/count-components\/#primaryimage"},"thumbnailUrl":"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1645097779643-Article_294.png","datePublished":"2020-07-01T09:47:14+00:00","dateModified":"2022-03-21T10:44:54+00:00","description":"In This Method We Are Going to Use Depth First Search or Dfs to Find Total Number of Connected Components. in Dfs(), We Are Going to Traverse All the Adjacent Vertices","breadcrumb":{"@id":"https:\/\/prepbytes.com\/blog\/count-components\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/prepbytes.com\/blog\/count-components\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/prepbytes.com\/blog\/count-components\/#primaryimage","url":"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1645097779643-Article_294.png","contentUrl":"https:\/\/prepbytes-misc-images.s3.ap-south-1.amazonaws.com\/assets\/1645097779643-Article_294.png"},{"@type":"BreadcrumbList","@id":"https:\/\/prepbytes.com\/blog\/count-components\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"http:\/\/43.205.93.38\/"},{"@type":"ListItem","position":2,"name":"Graphs Interview Questions","item":"https:\/\/prepbytes.com\/blog\/category\/graphs-interview-questions\/"},{"@type":"ListItem","position":3,"name":"Count Components"}]},{"@type":"WebSite","@id":"http:\/\/43.205.93.38\/#website","url":"http:\/\/43.205.93.38\/","name":"PrepBytes Blog","description":"ONE-STOP RESOURCE FOR EVERYTHING RELATED TO CODING","publisher":{"@id":"http:\/\/43.205.93.38\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/43.205.93.38\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"http:\/\/43.205.93.38\/#organization","name":"Prepbytes","url":"http:\/\/43.205.93.38\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/43.205.93.38\/#\/schema\/logo\/image\/","url":"https:\/\/blog.prepbytes.com\/wp-content\/uploads\/2025\/07\/uzxxllgloialmn9mhwfe.webp","contentUrl":"https:\/\/blog.prepbytes.com\/wp-content\/uploads\/2025\/07\/uzxxllgloialmn9mhwfe.webp","width":160,"height":160,"caption":"Prepbytes"},"image":{"@id":"http:\/\/43.205.93.38\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/prepbytes0211\/","https:\/\/www.instagram.com\/prepbytes\/","https:\/\/www.linkedin.com\/company\/prepbytes\/","https:\/\/www.youtube.com\/channel\/UC0xGnHDrjUM1pDEK2Ka5imA"]},{"@type":"Person","@id":"http:\/\/43.205.93.38\/#\/schema\/person\/3f7dc4ae851791d5947a7f99df363d5e","name":"Prepbytes","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/43.205.93.38\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/232042cd1a1ea0e982c96d2a2ec93fb70a8e864e00784491231e7bfe5a9e06b5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/232042cd1a1ea0e982c96d2a2ec93fb70a8e864e00784491231e7bfe5a9e06b5?s=96&d=mm&r=g","caption":"Prepbytes"},"url":"https:\/\/prepbytes.com\/blog\/author\/gourav-jaincollegedekho-com\/"}]}},"_links":{"self":[{"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/posts\/1876","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/users\/52"}],"replies":[{"embeddable":true,"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/comments?post=1876"}],"version-history":[{"count":11,"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/posts\/1876\/revisions"}],"predecessor-version":[{"id":8109,"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/posts\/1876\/revisions\/8109"}],"wp:attachment":[{"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/media?parent=1876"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/categories?post=1876"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prepbytes.com\/blog\/wp-json\/wp\/v2\/tags?post=1876"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}