Bird
Raised Fist0
DSA Rustprogramming~5 mins

Cycle Detection in Undirected Graph in DSA Rust - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a cycle in an undirected graph?
A cycle is a path that starts and ends at the same vertex, with all edges and vertices distinct except the first and last vertex.
Click to reveal answer
beginner
Which data structure is commonly used to detect cycles in an undirected graph?
Depth-First Search (DFS) is commonly used to detect cycles by checking if a visited vertex is encountered again and is not the parent of the current vertex.
Click to reveal answer
intermediate
In cycle detection using DFS, why do we check if the visited vertex is not the parent?
Because in an undirected graph, the edge to the parent is always present, so revisiting the parent does not mean a cycle. A cycle is detected only if a visited vertex other than the parent is found.
Click to reveal answer
intermediate
What is the time complexity of cycle detection in an undirected graph using DFS?
The time complexity is O(V + E), where V is the number of vertices and E is the number of edges, because each vertex and edge is visited once.
Click to reveal answer
advanced
Explain how Union-Find (Disjoint Set) can be used for cycle detection in an undirected graph.
Union-Find keeps track of connected components. For each edge, if the two vertices belong to the same set, a cycle exists. Otherwise, union their sets. This method efficiently detects cycles during edge additions.
Click to reveal answer
What does a cycle in an undirected graph mean?
AA path that visits every vertex exactly once
BA path that starts and ends at different vertices
CA path that has repeated edges but no repeated vertices
DA path that starts and ends at the same vertex with no repeated edges or vertices except start/end
In DFS cycle detection, what does revisiting a visited vertex that is not the parent indicate?
AA cycle is detected
BNo cycle, just backtracking
CGraph is disconnected
DVertex is isolated
What is the main purpose of the parent parameter in DFS cycle detection?
ATo find the shortest path
BTo mark the vertex as visited
CTo avoid counting the edge to the parent as a cycle
DTo count the number of edges
Which of the following is NOT a valid method for cycle detection in undirected graphs?
ATopological Sort
BBreadth-First Search (BFS) with parent tracking
CUnion-Find (Disjoint Set)
DDepth-First Search (DFS)
What is the time complexity of cycle detection using Union-Find in an undirected graph?
AO(V + E)
BO(E α(V)) where α is the inverse Ackermann function
CO(V^2)
DO(E log V)
Describe how Depth-First Search (DFS) can be used to detect a cycle in an undirected graph.
Think about revisiting nodes and how parent helps.
You got /4 concepts.
    Explain how the Union-Find data structure helps detect cycles when adding edges in an undirected graph.
    Focus on connected components and set membership.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main idea behind detecting a cycle in an undirected graph using DFS?
      easy
      A. If we visit a node that is already visited and is not the parent, a cycle exists.
      B. If all nodes are visited exactly once, the graph has a cycle.
      C. If the graph has more edges than nodes, it must have a cycle.
      D. If the graph is disconnected, it contains a cycle.

      Solution

      1. Step 1: Understand DFS traversal in undirected graph

        DFS visits nodes and tracks the parent node to avoid false cycle detection.
      2. Step 2: Detect cycle condition

        If a visited node is found that is not the parent, it means a back edge exists, indicating a cycle.
      3. Final Answer:

        If we visit a node that is already visited and is not the parent, a cycle exists. -> Option A
      4. Quick Check:

        Cycle detection in undirected graph = check visited & parent [OK]
      Hint: Check visited nodes excluding parent during DFS to find cycles [OK]
      Common Mistakes:
      • Ignoring the parent node when checking visited nodes
      • Assuming disconnected graph always has cycles
      • Confusing cycle detection logic with directed graphs
      • Counting edges vs nodes incorrectly
      2. Which Rust code snippet correctly initializes an adjacency list for an undirected graph with 3 nodes?
      easy
      A. let graph = vec![vec![]; 3]; graph[0].push(1); graph[1].push(0); graph[1].push(2); graph[2].push(1);
      B. let mut graph = vec![vec![]; 3]; graph[0].push(1); graph[1].push(0); graph[1].push(2); graph[2].push(1);
      C. let mut graph = vec![vec![]; 3]; graph[0].push(1); graph[1].push(2); graph[2].push(1);
      D. let mut graph = vec![vec![]; 3]; graph[0].push(1); graph[1].push(0); graph[2].push(1);

      Solution

      1. Step 1: Initialize mutable adjacency list

        Use let mut graph = vec![vec![]; 3]; to create a mutable vector of vectors for 3 nodes.
      2. Step 2: Add edges for undirected graph

        For each edge, add both directions: node 0 to 1 and node 1 to 0, node 1 to 2 and node 2 to 1.
      3. Final Answer:

        let mut graph = vec![vec![]; 3]; graph[0].push(1); graph[1].push(0); graph[1].push(2); graph[2].push(1); -> Option B
      4. Quick Check:

        Mutable adjacency list with bidirectional edges = correct initialization [OK]
      Hint: Use 'mut' and push edges both ways for undirected graph [OK]
      Common Mistakes:
      • Forgetting 'mut' keyword for mutable vector
      • Adding edges only one way in undirected graph
      • Trying to push to immutable vector
      • Incorrect vector initialization syntax
      3. What will be the output of the following Rust code snippet detecting cycle in an undirected graph?
      fn dfs(node: usize, parent: usize, graph: &Vec, visited: &mut Vec<bool>) -> bool {
          visited[node] = true;
          for &neighbor in &graph[node] {
              if !visited[neighbor] {
                  if dfs(neighbor, node, graph, visited) {
                      return true;
                  }
              } else if neighbor != parent {
                  return true;
              }
          }
          false
      }
      
      fn main() {
          let mut graph = vec![vec![]; 4];
          graph[0].push(1); graph[1].push(0);
          graph[1].push(2); graph[2].push(1);
          graph[2].push(3); graph[3].push(2);
          graph[3].push(1); graph[1].push(3);
      
          let mut visited = vec![false; 4];
          let has_cycle = dfs(0, usize::MAX, &graph, &mut visited);
          println!("{}", has_cycle);
      }
      medium
      A. Runtime panic
      B. false
      C. true
      D. Compilation error

      Solution

      1. Step 1: Analyze graph edges and structure

        The graph edges form a cycle: 1-2-3-1, so cycle exists.
      2. Step 2: Trace DFS cycle detection logic

        DFS visits nodes and finds a visited neighbor (1) not equal to parent, returning true.
      3. Final Answer:

        true -> Option C
      4. Quick Check:

        Cycle detected in DFS = true [OK]
      Hint: Look for back edges to visited nodes excluding parent [OK]
      Common Mistakes:
      • Ignoring the edge from 3 to 1 forming a cycle
      • Confusing parent node with visited node
      • Assuming no cycle if start node is 0
      • Misreading DFS return conditions
      4. Identify the bug in this Rust DFS cycle detection code for an undirected graph:
      fn dfs(node: usize, parent: usize, graph: &Vec, visited: &mut Vec<bool>) -> bool {
          visited[node] = true;
          for &neighbor in &graph[node] {
              if visited[neighbor] {
                  if neighbor != parent {
                      return true;
                  }
              } else {
                  dfs(neighbor, node, graph, visited);
              }
          }
          false
      }
      medium
      A. Missing return statement for recursive dfs call
      B. Incorrect parent check condition
      C. Visited vector should be immutable
      D. Graph should be mutable

      Solution

      1. Step 1: Check recursive call usage

        The recursive call to dfs is made but its result is ignored, missing return propagation.
      2. Step 2: Fix by returning recursive call result

        Return the result of dfs(neighbor, node, graph, visited) to propagate cycle detection upwards.
      3. Final Answer:

        Missing return statement for recursive dfs call -> Option A
      4. Quick Check:

        Return recursive dfs result to detect cycles correctly [OK]
      Hint: Always return recursive call result in DFS for cycle detection [OK]
      Common Mistakes:
      • Ignoring return value of recursive DFS calls
      • Confusing parent check logic
      • Using immutable visited vector incorrectly
      • Assuming graph mutability is required here
      5. Given an undirected graph represented as adjacency list in Rust, how can you modify the DFS cycle detection to handle disconnected graphs and detect cycles in all components? Choose the best approach.
      hard
      A. Use BFS instead of DFS for cycle detection.
      B. Run DFS only from node 0, assuming graph is connected.
      C. Mark all nodes visited initially and then run DFS once.
      D. Run DFS from every unvisited node in a loop to cover all components.

      Solution

      1. Step 1: Understand disconnected graph scenario

        Disconnected graphs have multiple components; DFS from one node covers only one component.
      2. Step 2: Modify DFS to run on all components

        Loop over all nodes, run DFS if node is unvisited to detect cycles in every component.
      3. Final Answer:

        Run DFS from every unvisited node in a loop to cover all components. -> Option D
      4. Quick Check:

        Cycle detection in disconnected graph = DFS from all unvisited nodes [OK]
      Hint: Loop DFS over all nodes to cover disconnected components [OK]
      Common Mistakes:
      • Assuming graph is always connected
      • Running DFS only once from node 0
      • Using BFS without cycle detection logic
      • Marking all nodes visited before DFS
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard