📖 Scenario: You are working on a network system where devices are connected by cables. You want to check if there is any loop (cycle) in the network connections because loops can cause problems in data transmission.
🎯 Goal: Build a program to detect if an undirected graph (network) contains any cycle using Depth First Search (DFS).
📋 What You'll Learn
Create an adjacency list to represent the graph with given edges
Add a visited array to track visited nodes
Implement a DFS function to detect cycles
Print whether the graph contains a cycle or not
💡 Why This Matters
🌍 Real World
Cycle detection is important in network design, deadlock detection in operating systems, and verifying dependencies in software projects.
💼 Career
Understanding graph traversal and cycle detection is essential for software engineers working with networks, databases, and complex data relationships.
Progress0 / 4 steps
1
Create the graph adjacency list
Create an integer variable V and set it to 5 for the number of vertices. Then create an adjacency list called adj as a vector of vectors of integers with size V. Add these edges to adj: 0-1, 1-2, 2-3, 3-4, and 4-1.
DSA C++
Hint
Remember to add edges in both directions because the graph is undirected.
2
Create the visited array
Create a boolean vector called visited with size V and initialize all values to false.
DSA C++
Hint
This array will help track which nodes have been checked during DFS.
3
Implement DFS function to detect cycle
Write a function called bool dfs(int node, int parent, const std::vector>& adj, std::vector& visited) that returns true if a cycle is found starting from node. Mark node as visited. For each neighbor of node, if it is not visited, recursively call dfs with neighbor and current node as parent. If neighbor is visited and not the parent, return true. Return false if no cycle found.
DSA C++
Hint
Think of the parent node to avoid counting the edge back to where you came from as a cycle.
4
Detect cycle and print result
Use a for loop with variable i from 0 to V-1. If visited[i] is false, call dfs(i, -1, adj, visited). If it returns true, print "Cycle detected" and return. If loop finishes without detecting cycle, print "No cycle detected".
DSA C++
Hint
Stop checking as soon as you find a cycle and print the message.
Practice
(1/5)
1. What is the main idea behind detecting a cycle in an undirected graph using DFS?
easy
A. If all nodes are visited once, the graph has a cycle.
B. If we visit a node that is already visited and is not the parent, a cycle exists.
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
Step 1: Understand DFS traversal in undirected graph
DFS visits nodes and tracks the parent node to avoid false cycle detection.
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.
Final Answer:
If we visit a node that is already visited and is not the parent, a cycle exists. -> Option B
Quick Check:
Cycle detection in undirected graph = check visited and parent [OK]
Hint: Check visited nodes excluding parent to find cycles [OK]
Common Mistakes:
Ignoring the parent node in cycle check
Assuming disconnected graph always has cycles
Confusing cycle detection with number of edges
2. Which of the following C++ function signatures is correct for a DFS-based cycle detection helper in an undirected graph?
easy
A. bool dfs(int node, int parent, vector& graph, vector<bool>& visited);
B. void dfs(int node, vector<int>& graph, vector<bool>& visited);
C. bool dfs(int node, vector<int>& graph, vector<int>& visited, int parent);
D. int dfs(int node, int parent, vector<int>& graph, vector<bool>& visited);
Solution
Step 1: Analyze function parameters for DFS cycle detection
We need current node, parent node, adjacency list (graph), and visited array.
Step 2: Check return type and parameter types
Return type should be bool to indicate cycle presence; graph is vector of vectors; visited is bool vector.
Final Answer:
bool dfs(int node, int parent, vector& graph, vector<bool>& visited); -> Option A
Quick Check:
Correct DFS signature includes parent and returns bool [OK]
Using wrong graph data type (vector<int> instead of vector)
Missing parent parameter
Wrong return type for cycle detection
3. What will be the output of the following code snippet detecting cycle in an undirected graph?
int main() {
vector graph = {{1,2}, {0,2}, {0,1,3}, {2}};
vector<bool> visited(4, false);
bool hasCycle = false;
function dfs = [&](int node, int parent) {
visited[node] = true;
for (int adj : graph[node]) {
if (!visited[adj]) {
if (dfs(adj, node)) return true;
} else if (adj != parent) {
return true;
}
}
return false;
};
for (int i = 0; i < 4; i++) {
if (!visited[i]) {
if (dfs(i, -1)) {
hasCycle = true;
break;
}
}
}
cout << (hasCycle ? "Cycle Found" : "No Cycle") << endl;
return 0;
}
medium
A. Runtime Error
B. No Cycle
C. Compilation Error
D. Cycle Found
Solution
Step 1: Analyze graph structure
Graph edges: 0-1, 0-2, 1-2, 2-3. Nodes 0,1,2 form a triangle (cycle).
Step 2: Trace DFS cycle detection
DFS visits nodes and finds back edge between 0 and 2 or 1 and 2, detecting cycle.
Final Answer:
Cycle Found -> Option D
Quick Check:
Triangle in graph means cycle detected [OK]
Hint: Triangle or more edges among nodes means cycle [OK]
Common Mistakes:
Ignoring back edge condition
Assuming no cycle if graph is connected
Confusing parent node with visited node
4. Identify the bug in the following cycle detection code for an undirected graph:
bool dfs(int node, int parent, vector& graph, vector<bool>& visited) {
visited[node] = true;
for (int adj : graph[node]) {
if (!visited[adj]) {
if (dfs(adj, node, graph, visited)) return true;
} else {
return true;
}
}
return false;
}
medium
A. It returns true even if adjacent node is the parent, causing false cycle detection.
B. It does not mark nodes as visited.
C. It uses wrong data types for graph and visited.
D. It never returns false.
Solution
Step 1: Review cycle detection condition
The else block returns true if adjacent node is visited, but does not check if it is the parent.
Step 2: Identify impact of missing parent check
Returning true for parent node causes false positive cycle detection.
Final Answer:
It returns true even if adjacent node is the parent, causing false cycle detection. -> Option A
Quick Check:
Check parent node before returning true for visited adjacency [OK]
Hint: Always exclude parent node when checking visited adjacency [OK]
Common Mistakes:
Not checking if visited node is parent
Returning true too early
Incorrect recursion parameters
5. Given a graph with 5 nodes and edges: 0-1, 1-2, 2-3, 3-4, 4-1, which modification to the DFS cycle detection algorithm will correctly identify the cycle and also return the nodes involved in the cycle?
hard
A. Remove the parent check and mark all visited nodes as cycle nodes.
B. Use BFS instead of DFS to detect cycles and print nodes.
C. Modify DFS to store the path stack and return the cycle path when a back edge is found.
D. Count edges and nodes; if edges >= nodes, print all nodes as cycle.
Solution
Step 1: Understand cycle detection with node tracking
DFS can track the current path using a stack or vector to record nodes visited in the current recursion.
Step 2: Modify DFS to return cycle path
When a back edge is found (visited node not parent), extract nodes from the path stack to get cycle nodes.
Final Answer:
Modify DFS to store the path stack and return the cycle path when a back edge is found. -> Option C
Quick Check:
Track path in DFS to identify cycle nodes [OK]
Hint: Use path stack in DFS to retrieve cycle nodes [OK]
Common Mistakes:
Using BFS which doesn't track path easily
Ignoring parent check causing false cycles
Using edge count alone to identify cycle nodes
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.