Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Graph {
- ArrayList<Integer>[] edges;
- ArrayList<Integer>[] revEdges;
- int n;
- int[] color;
- int[] color2;
- boolean[] was;
- final int WHITE = 0;
- final int GREY = 1;
- final int BLACK = 2;
- public Graph(int n) {
- this.n = n;
- edges = new ArrayList[n];
- revEdges = new ArrayList[n];
- for (int i = 0; i < edges.length; i++) {
- edges[i] = new ArrayList<Integer>();
- revEdges[i] = new ArrayList<Integer>();
- }
- }
- void addEdge(int from, int to) {
- edges[from].add(to);
- revEdges[to].add(from);
- }
- ArrayList<Integer> getTopSort() {
- ArrayList<Integer> ret = new ArrayList<Integer>();
- color = new int[n];
- for (int i = 0; i < n; i++) {
- if (color[i] != WHITE) {
- continue;
- }
- dfs(i, ret);
- }
- Collections.reverse(ret);
- return ret;
- }
- void dfs(int v, ArrayList<Integer> t) {
- color[v] = GREY;
- for (int i : edges[v]) {
- if (color[i] == GREY) {
- continue;
- }
- if (color[i] == WHITE) {
- dfs(i, t);
- }
- }
- color[v] = BLACK;
- t.add(v);
- }
- void dfs2(int v, int curColor) {
- color2[v] = curColor;
- was[v] = true;
- for (int i : revEdges[v]) {
- if (was[i]) {
- continue;
- }
- dfs2(i, curColor);
- }
- }
- int[] getTopSortCond() {
- ArrayList<Integer> top = getTopSort();
- color2 = new int[n];
- int curColor = 0;
- was = new boolean[n];
- for (int i : top) {
- if (was[i]) {
- continue;
- }
- dfs2(i, curColor++);
- }
- Graph g = new Graph(curColor);
- for (int i = 0; i < n; i++) {
- for (int j : edges[i]) {
- if (color2[i] != color2[j]) {
- g.addEdge(color2[i], color2[j]);
- }
- }
- }
- ArrayList<Integer> condTop = g.getTopSort();
- int[] p = new int[curColor];
- for (int i = 0; i < condTop.size(); i++) {
- p[condTop.get(i)] = i;
- }
- int[] ret = new int[n];
- for (int i = 0; i < n; i++) {
- ret[i] = p[color2[i]];
- }
- return ret;
- }
- }
Add Comment
Please, Sign In to add comment