https://leetcode.com/problems/course-schedule/
hum 3 state maintain krenge har node ki
1. state = 0: node not visited
2. state =1: node visited and is part of current path
Yeh cycle detect karega, agr hum dobara iss node par aa gae, jo ki visited bhi hai and current path ka part bhi hai
3. state =2: node visited but, not part of current path,
Reason: iss node ko apne ans me add kr chuke hain, current path se backtrack kr chuke hain hum, to jab dobara iss node pr aaenge to kuch nhi krenge
package pep.Day44;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class LeetCode_207_Course_Schedule_DFS {
public static void main(String[] args) {
// non-cycle
int[][] paths = {
{0, 1}, {1, 2}, {2, 4}, {4, 5}, {5, 6}, {5, 7}, {6, 7}, {2, 8}, {8, 5}, {0, 3}, {3, 2}
};
//cycle
int[][] paths1 = {
{0, 1}, {1, 2}, {2, 4}, {4, 5}, {5, 6}, {5, 7}, {6, 7}, {2, 8}, {8, 5}, {3, 0}, {2, 3}
};
System.out.println(canFinish(9, paths1));
}
public static boolean canFinish(int n, int[][] pre) {
ArrayList<Integer>[] graph = new ArrayList[n];
for (int i = 0; i < n; i++) {
graph[i] = new ArrayList<>();
}
for (int[] p : pre) {
graph[p[0]].add(p[1]);
}
List<Integer> ans = new ArrayList<>();
int[] state = new int[n];
for (int i = 0; i < n; i++) {
if (state[i] == 0)
dfs(graph, i, state, ans);
}
return ans.size() == n;
}
public static boolean dfs(ArrayList<Integer>[] graph, int src, int[] state, List<Integer> ans) {
state[src] = 1; // isko visit kr chuke hain, aur yeh humare
// current path ka part bhi hai
// iske neighbours
for (int nbr : graph[src]) {
if (state[nbr] == 1) // visited bhi hai, current path ka hissa bhi hai, aur hum dobara aa gae iss pr
return false; // iska matlb cycle hai
if (state[nbr] == 0) // visited bhi nhi hai, to dfs call
{
boolean val = dfs(graph, nbr, state, ans);
// also, agr dfs se false aa gya jab humne uske nbr ke lea call lgaya, return false
if (val == false)
return false;
}
}
// yha tak sab nbr ko call lag gae hai, aur hum backtrack krte hue jaa rhe hain
state[src] = 2;
ans.add(src);
return true;
}
}
No comments:
Post a Comment