<p>You are given an integer <code>n</code>. There is an <strong>undirected</strong> graph with <code>n</code> vertices, numbered from <code>0</code> to <code>n - 1</code>. You are given a 2D integer array <code>edges</code> where <code>edges[i] = [a<sub>i</sub>, b<sub>i</sub>]</code> denotes that there exists an <strong>undirected</strong> edge connecting vertices <code>a<sub>i</sub></code> and <code>b<sub>i</sub></code>.</p>

<p>Return <em>the number of <strong>complete connected components</strong> of the graph</em>.</p>

<p>A <strong>connected component</strong> is a subgraph of a graph in which there exists a path between any two vertices, and no vertex of the subgraph shares an edge with a vertex outside of the subgraph.</p>

<p>A connected component is said to be <b>complete</b> if there exists an edge between every pair of its vertices.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<p><strong class="example"><img alt="" src="https://assets.leetcode.com/uploads/2023/04/11/screenshot-from-2023-04-11-23-31-23.png" style="width: 671px; height: 270px;" /></strong></p>

<pre>
<strong>Input:</strong> n = 6, edges = [[0,1],[0,2],[1,2],[3,4]]
<strong>Output:</strong> 3
<strong>Explanation:</strong> From the picture above, one can see that all of the components of this graph are complete.
</pre>

<p><strong class="example">Example 2:</strong></p>

<p><strong class="example"><img alt="" src="https://assets.leetcode.com/uploads/2023/04/11/screenshot-from-2023-04-11-23-32-00.png" style="width: 671px; height: 270px;" /></strong></p>

<pre>
<strong>Input:</strong> n = 6, edges = [[0,1],[0,2],[1,2],[3,4],[3,5]]
<strong>Output:</strong> 1
<strong>Explanation:</strong> The component containing vertices 0, 1, and 2 is complete since there is an edge between every pair of two vertices. On the other hand, the component containing vertices 3, 4, and 5 is not complete since there is no edge between vertices 4 and 5. Thus, the number of complete components in this graph is 1.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= n &lt;= 50</code></li>
	<li><code>0 &lt;= edges.length &lt;= n * (n - 1) / 2</code></li>
	<li><code>edges[i].length == 2</code></li>
	<li><code>0 &lt;= a<sub>i</sub>, b<sub>i</sub> &lt;= n - 1</code></li>
	<li><code>a<sub>i</sub> != b<sub>i</sub></code></li>
	<li>There are no repeated edges.</li>
</ul>

class Solution:
    def countCompleteComponents(self, n: int, edges: List[List[int]]) -> int:
        adj_dict = self.ini_adj_list(n, edges)
        visited_node = {i:0 for i in range(n)}
        # print(adj_dict, visited_node)
        count=0
        for i in range(n):
            # count += 1
            # print(visited_node)
            if visited_node[i]==False:
                # count += 1
                node_list = []
                self.dfs(i, adj_dict, visited_node, node_list)
                if self.is_completed(node_list, adj_dict):
                    count += 1
        return count
    def is_completed(self,n,adj_dict):
        for i in n:
            #print(set(adj_dict[i]), len(n)-1)
            if len(set(adj_dict[i])) != len(n)-1:
                return 0
        return 1

    def ini_adj_list(self, n, edges):
        adj_graph = {i:[] for i in range(n)}
        # adj_graph ={}
        for e in edges:
            if adj_graph.get(e[0]):
                adj_graph[e[0]].append(e[1])
            else:
                adj_graph[e[0]] = [e[1]]
            if adj_graph.get(e[1]):
                adj_graph[e[1]].append(e[0])
            else:
                adj_graph[e[1]] = [e[0]]
        return adj_graph
    def dfs(self, node, adj_dict, visited_node, node_list):
        # node_list.append(node)
        # if visited_node[node] == False:
        #     print(f"{node}--->",end="")
        # print(visited_node, adj_dict[node])
        if visited_node[node] == True:
            return
        else:
            node_list.append(node)
            visited_node[node] = True
            # print(f"{node}--->",end="")
            # print(node)
            for adj_node in adj_dict[node]:
                # visited_node[adj_node] = True
                self.dfs(adj_node, adj_dict, visited_node, node_list)
                # visited_node[adj_node] = True

559