Finding Cycles in an Undirected Graphs (using DFS)

Greedy Algorithm

C++ Code

Using Depth-First Search algorithm to traverse the graph and detect cycles. The graph is represented as an adjacency list, where each node is a vector of integers representing its neighbors. The algorithm starts at node 0 and keeps track of the visited nodes and their parent nodes. If it encounters a node that has already been partially visited, it means that a cycle has been detected. The algorithm then backtracks from the current node to its parent nodes to form the cycle and stores it in a vector of cycles. Finally, the program prints out all the cycles found in the graph.

Time Complexity: O(n+m)

            vector<vector<int> cycles;

              void DFS_Cycles_Finder(vector<vector<int> &graph, vector<int> &visited, vector<int> &parents, int node, int p)
              {
                  // visited status 0: unvisited
                  // visited status 1: partially visited
                  // visited status 2: fully visited
              
                  if (visited.at(node) == 0)
                  {
                      parents.at(node) = p;
                      visited.at(node) = 1;
                      for (auto neighbor : graph.at(node))
                      {
                          if (neighbor != parents.at(node))
                          {
                              DFS_Cycles_Finder(graph, visited, parents, neighbor, node);
                          }
                      }
                      visited.at(node) = 2;
                  }
                  else if (visited.at(node) == 1)
                  {
                      vector<int> newCycle;
                      int currentNode = p;
                      newCycle.push_back(currentNode);
                      while (currentNode != node)
                      {
                          currentNode = parents.at(currentNode);
                          newCycle.push_back(currentNode);
                      }
                      cycles.push_back(newCycle);
                  }
              }
              
              int main()
              {
                  vector<vector<int>> graph = {
                      {1, 2},
                      {0, 3},
                      {0, 3},
                      {1, 2, 4},
                      {3, 5, 6},
                      {4, 6},
                      {4, 5}};
                  vector<int> visited;
                  visited.resize(graph.size(), 0);
                  vector<int> parents;
                  parents.resize(graph.size(), -1);
              
                  DFS_Cycles_Finder(graph, visited, parents, 0, 0);
              
                  for (int i = 0; i < cycles.size(); i++)
                  {
                      for (int j = 0; j < cycles.at(i).size(); j++)
                      {
                          cout << cycles.at(i).at(j) << " ";
                      }
                      cout << endl;
                  }
              }