Guest User

Untitled

a guest
Jun 24th, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.20 KB | None | 0 0
  1. public class Solution {
  2. private IList<IList<int>> graph;
  3. private bool[] marked;
  4. private bool[] onStack;
  5. private bool hasCycle;
  6. private Stack<int> s;
  7.  
  8. public int[] FindOrder(int numCourses, int[,] prerequisites) {
  9. graph = new List<IList<int>>();
  10. marked = new bool[numCourses];
  11. onStack = new bool[numCourses];
  12. s = new Stack<int>();
  13.  
  14. for (int i = 0; i < numCourses; i++) {
  15. graph.Add(new List<int>());
  16. }
  17.  
  18. int numEdges = prerequisites.Length >> 1;
  19. for (int i = 0; i < numEdges; i++) {
  20. graph[prerequisites[i, 1]].Add(prerequisites[i, 0]);
  21. }
  22.  
  23. for (int i = 0; i < numCourses; i++) {
  24. if (hasCycle) break;
  25. if (!marked[i]) dfs(i);
  26. }
  27.  
  28. return hasCycle ? new int[0] : s.ToArray();
  29. }
  30.  
  31. private void dfs(int v) {
  32. marked[v] = true;
  33. onStack[v] = true;
  34.  
  35. foreach (int w in graph[v]) {
  36. if (!marked[w]) dfs(w);
  37. else if (onStack[w]) {
  38. hasCycle = true;
  39. return;
  40. }
  41. }
  42.  
  43. s.Push(v);
  44. onStack[v] = false;
  45. }
  46. }
Add Comment
Please, Sign In to add comment