πDay 7. Directed Graph Cycle π§
The problem can be found at the following link: Question Link
Note: Sorry for uploading late, my Final Sem exam is going on.
π‘ Problem Description:
Given a Directed Graph with V vertices (numbered from 0 to V-1) and E edges, determine whether the graph contains any cycle.
The graph is represented as a 2D vector edges[][]
, where each entry edges[i] = [u, v]
denotes an edge from vertex u to v.
π Example Walkthrough:
Example 1:
Input:
V = 4, edges[][] = [[0, 1], [1, 2], [2, 3], [3, 3]]
Output:
true
Explanation:
There is a self-loop at vertex 3 (3 -> 3) which forms a cycle.
Example 2:
Input:
V = 3, edges[][] = [[0, 1], [1, 2]]
Output:
false
Explanation:
There is no cycle in the graph.
π― My Approach:
Kahnβs Algorithm (BFS-based Cycle Detection)
Build the Graph and Compute In-Degrees:
Convert the edge list into an adjacency list.
Compute the in-degree for each vertex.
Initialize a Queue:
Add all vertices with zero in-degree into a queue.
Process Vertices:
While the queue is not empty, remove a vertex and decrement the in-degree of its neighbors.
If any neighborβs in-degree becomes zero, add it to the queue.
Count the number of vertices processed.
Cycle Check:
If the count of processed vertices is not equal to V, a cycle exists.
π Time and Auxiliary Space Complexity
Expected Time Complexity: O(V + E), since each vertex and edge is processed once.
Expected Auxiliary Space Complexity: O(V + E), due to the in-degree array, adjacency list, and queue.
π Solution Code
Code (C)
bool isCycle(struct graph *g, int n, int m) {
int in[N] = {}, q[N], f = 0, r = 0, c = 0;
for (int i = 0; i < n; i++)
for (struct ListNode *p = g->head[i]; p; p = p->next)
in[p->data]++;
for (int i = 0; i < n; i++) if (!in[i]) q[r++] = i;
while (f < r) {
int u = q[f++];
c++;
for (struct ListNode *p = g->head[u]; p; p = p->next)
if (--in[p->data] == 0) q[r++] = p->data;
}
return c != n;
}
Code (C++)
class Solution {
public:
bool isCyclic(int V, vector<vector<int>>& edges) {
vector<vector<int>> g(V);
vector<int> in(V);
for (auto& e : edges) g[e[0]].push_back(e[1]), in[e[1]]++;
queue<int> q;
for (int i = 0; i < V; i++) if (!in[i]) q.push(i);
int c = 0;
while (!q.empty()) {
int u = q.front(); q.pop(); c++;
for (int v : g[u]) if (--in[v] == 0) q.push(v);
}
return c != V;
}
};
Code (Java)
class Solution {
public boolean isCyclic(int V, int[][] edges) {
List<Integer>[] g = new ArrayList[V];
int[] in = new int[V];
for (int i = 0; i < V; i++) g[i] = new ArrayList<>();
for (int[] e : edges) { g[e[0]].add(e[1]); in[e[1]]++; }
Queue<Integer> q = new ArrayDeque<>();
for (int i = 0; i < V; i++) if (in[i] == 0) q.add(i);
int c = 0;
while (!q.isEmpty()) {
int u = q.poll(); c++;
for (int v : g[u]) if (--in[v] == 0) q.add(v);
}
return c != V;
}
}
Code (Python)
class Solution:
def isCycle(self, V, edges):
g = [[] for _ in range(V)]
in_d = [0]*V
for u, v in edges: g[u].append(v); in_d[v] += 1
q = [i for i in range(V) if in_d[i] == 0]
c = 0
while q:
u = q.pop(0); c += 1
for v in g[u]:
in_d[v] -= 1
if in_d[v] == 0: q.append(v)
return c != V
π― Contribution and Support:
For discussions, questions, or doubts related to this solution, feel free to connect on LinkedIn: Any Questions. Letβs make this learning journey more collaborative!
β If you find this helpful, please give this repository a star! β
πVisitor Count
Last updated