Программа для подсчета количества связанных компонентов в неориентированном графе
Для неориентированного графа g задача состоит в том, чтобы вывести количество связанных компонентов в графе.
Примеры:
Input:
Output: 3
There are three connected components:
1 – 5, 0 – 2 – 4 and 3
Подход: идея состоит в том, чтобы использовать счетчик переменных для хранения количества подключенных компонентов и выполнить следующие шаги:
- Инициализировать все вершины как непосещенные.
- Для всех вершин проверьте, не была ли вершина посещена, затем выполните DFS для этой вершины и увеличьте счетчик переменных на 1.
Below is the implementation of the above approach:
C++
// C++ program for above approach#include <bits/stdc++.h>using namespace std;// Graph class represents a undirected graph// using adjacency list representationclass Graph { // No. of vertices int V; // Pointer to an array containing adjacency lists list<int>* adj; // A function used by DFS void DFSUtil(int v, bool visited[]);public: // Constructor Graph(int V); void addEdge(int v, int w); int NumberOfconnectedComponents();};// Function to return the number of// connected components in an undirected graphint Graph::NumberOfconnectedComponents(){ // Mark all the vertices as not visited bool* visited = new bool[V]; // To store the number of connected components int count = 0; for (int v = 0; v < V; v++) visited[v] = false; for (int v = 0; v < V; v++) { if (visited[v] == false) { DFSUtil(v, visited); count += 1; } } return count;}void Graph::DFSUtil(int v, bool visited[]){ // Mark the current node as visited visited[v] = true; // Recur for all the vertices // adjacent to this vertex list<int>::iterator i; for (i = adj[v].begin(); i != adj[v].end(); ++i) if (!visited[*i]) DFSUtil(*i, visited);}Graph::Graph(int V){ this->V = V; adj = new list<int>[V];}// Add an undirected edgevoid Graph::addEdge(int v, int w){ adj[v].push_back(w); adj[w].push_back(v);}// Driver codeint main(){ Graph g(5); g.addEdge(1, 0); g.addEdge(2, 3); g.addEdge(3, 4); cout << g.NumberOfconnectedComponents(); return 0;} |
Java
// Java program for above approachimport java.io.*;import java.util.*;public class ConnectedComponentCount{ private int v; private int e; private Map<Integer, HashSet<Integer>> adjMap; private static Map<Integer, Integer> visited; ConnectedComponentCount(int vertices) { v = vertices; adjMap = new HashMap<Integer, HashSet<Integer>>(); visited = new HashMap<Integer, Integer>(); } // Function to add edges private void addEdge(int s, int d) { adjMap.putIfAbsent(s, new HashSet<Integer>()); adjMap.putIfAbsent(d, new HashSet<Integer>()); adjMap.get(s).add(d); adjMap.get(s).add(s); adjMap.get(d).add(s); adjMap.get(d).add(d); visited.put(s, 0); visited.put(d, 0); } // To mark vertices which can be visites private void findDFS(int vertex) { // Mark as visited visited.put(vertex,1); // Print the vertex System.out.println("vertex " + vertex + " visited"); for(Integer child : adjMap.get(vertex)) { if(visited.get(child) == 0){ findDFS(child); } } } // Function to print graph private void printGraph() { for(HashSet<Integer> v : adjMap.values()) { System.out.println(v.toString()); } } // Driver Code public static void main(String args[]) { Scanner sc = new Scanner(System.in); System.out.println("Enter the number of vertices (V): "); int vertices = sc.nextInt(); System.out.println("Enter the number of edges (E): "); int edges = sc.nextInt(); // To count total number of // components int ccCount = 0; ConnectedComponentCount ccc = new ConnectedComponentCount( vertices); // Input of edges while (edges > 0) { System.out.println("Enter the nodes s & d: "); int s = sc.nextInt(); int d = sc.nextInt(); ccc.addEdge(s,d); edges-- ; } // Function to print graph ccc.printGraph(); // Traversing every node for(Integer vertex : visited.keySet()) { // Check if vertex is already // visited or not if(visited.get(vertex) == 0) { // Function Call for findDFS ccc.findDFS(vertex); // Print Component Found System.out.println("CC Found"); // Increase the counter ccCount++; } } // Print number of components System.out.println("Number of cc component: " + ccCount); }}//The code is contributed by Alfred Skaria |
Python3
# Python3 program for above approach# Graph class represents a undirected graph# using adjacency list representationclass Graph: def __init__(self, V): # No. of vertices self.V = V # Pointer to an array containing # adjacency lists self.adj = [[] for i in range(self.V)] # Function to return the number of # connected components in an undirected graph def NumberOfconnectedComponents(self): # Mark all the vertices as not visited visited = [False for i in range(self.V)] # To store the number of connected # components count = 0 for v in range(self.V): if (visited[v] == False): self.DFSUtil(v, visited) count += 1 return count def DFSUtil(self, v, visited): # Mark the current node as visited visited[v] = True # Recur for all the vertices # adjacent to this vertex for i in self.adj[v]: if (not visited[i]): self.DFSUtil(i, visited) # Add an undirected edge def addEdge(self, v, w): self.adj[v].append(w) self.adj[w].append(v) # Driver code if __name__=="__main__": g = Graph(5) g.addEdge(1, 0) g.addEdge(2, 3) g.addEdge(3, 4) print(g.NumberOfconnectedComponents())# This code is contributed by rutvik_56 |
2
Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.
