Connected Components - Undirected Graph |
This algorithm finds the connected components of an undirected graph using depth-first search (DFS) traversal. The resulting vector of components is then printed out, along with the number of components found.
Time Complexity: O(m+n), where m is the number of edges and n is the number of vertices
vector<bool> visited; vector<int> finish_times; vector<vector<int>> components = {}; void find_connected_components(vector<vector<int>> &graph) { visited.resize(graph.size(), false); for (int i = 0; i < graph.size(); i++) { if (!visited.at(i)) { components.push_back({}); DFS(graph, i); } } } void DFS(vector<vector<int>> &graph, int vertix) { if (!visited.empty()) { visited.resize(graph.size(), false); } visited.at(vertix) = true; components.at(components.size() - 1).push_back(vertix); for (int i = 0; i < graph.at(vertix).size(); i++) { if (!visited.at(graph.at(vertix).at(i))) { DFS(graph, graph.at(vertix).at(i)); } } } // Example Run int main() { // Sample Adjecency Listx vector<vector<int>> graph = { {1, 2, 3}, {0, 2, 3}, {0, 1, 3}, {0, 1, 2}, {5}, {4}, {7, 8}, {6, 8}, {6, 7}, }; // Sample Run find_connected_components(graph); cout << "Number of Components: " << components.size() << endl; for (int i = 0; i < components.size(); i++) { cout << "Component " << i + 1 << ": " << endl; for (int j = 0; j < components.at(i).size(); j++) { cout << components.at(i).at(j) << " "; } cout << endl; } }