Guest User

Untitled

a guest
Jan 19th, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.95 KB | None | 0 0
  1. class Graph {
  2. ArrayList<Integer>[] edges;
  3. ArrayList<Integer>[] revEdges;
  4. int n;
  5. int[] color;
  6. int[] color2;
  7. boolean[] was;
  8. final int WHITE = 0;
  9. final int GREY = 1;
  10. final int BLACK = 2;
  11.  
  12. public Graph(int n) {
  13. this.n = n;
  14. edges = new ArrayList[n];
  15. revEdges = new ArrayList[n];
  16. for (int i = 0; i < edges.length; i++) {
  17. edges[i] = new ArrayList<Integer>();
  18. revEdges[i] = new ArrayList<Integer>();
  19. }
  20. }
  21.  
  22. void addEdge(int from, int to) {
  23. edges[from].add(to);
  24. revEdges[to].add(from);
  25. }
  26.  
  27. ArrayList<Integer> getTopSort() {
  28. ArrayList<Integer> ret = new ArrayList<Integer>();
  29. color = new int[n];
  30. for (int i = 0; i < n; i++) {
  31. if (color[i] != WHITE) {
  32. continue;
  33. }
  34. dfs(i, ret);
  35. }
  36. Collections.reverse(ret);
  37. return ret;
  38. }
  39.  
  40. void dfs(int v, ArrayList<Integer> t) {
  41. color[v] = GREY;
  42. for (int i : edges[v]) {
  43. if (color[i] == GREY) {
  44. continue;
  45. }
  46. if (color[i] == WHITE) {
  47. dfs(i, t);
  48. }
  49. }
  50. color[v] = BLACK;
  51. t.add(v);
  52. }
  53.  
  54. void dfs2(int v, int curColor) {
  55. color2[v] = curColor;
  56. was[v] = true;
  57. for (int i : revEdges[v]) {
  58. if (was[i]) {
  59. continue;
  60. }
  61. dfs2(i, curColor);
  62. }
  63. }
  64.  
  65. int[] getTopSortCond() {
  66. ArrayList<Integer> top = getTopSort();
  67. color2 = new int[n];
  68. int curColor = 0;
  69. was = new boolean[n];
  70. for (int i : top) {
  71. if (was[i]) {
  72. continue;
  73. }
  74. dfs2(i, curColor++);
  75. }
  76. Graph g = new Graph(curColor);
  77. for (int i = 0; i < n; i++) {
  78. for (int j : edges[i]) {
  79. if (color2[i] != color2[j]) {
  80. g.addEdge(color2[i], color2[j]);
  81. }
  82. }
  83. }
  84. ArrayList<Integer> condTop = g.getTopSort();
  85. int[] p = new int[curColor];
  86. for (int i = 0; i < condTop.size(); i++) {
  87. p[condTop.get(i)] = i;
  88. }
  89. int[] ret = new int[n];
  90. for (int i = 0; i < n; i++) {
  91. ret[i] = p[color2[i]];
  92. }
  93. return ret;
  94. }
  95. }
Add Comment
Please, Sign In to add comment