Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.Scanner;
- public class Main {
- static boolean[] used;
- static int[] c;
- static ArrayList<Integer>[] g;
- static ArrayList<Integer>[] g_rev;
- static ArrayList<Integer> topSort = new ArrayList<>();
- public static void dfs1(int ver) {
- used[ver] = true;
- for (Integer j : g[ver]) {
- if (!used[j]) {
- dfs1(j);
- }
- }
- topSort.add(ver);
- }
- public static void dfs2(int ver, int color) {
- c[ver] = color;
- for (Integer j : g_rev[ver]) {
- if (c[j] == 0) {
- dfs2(j, color);
- }
- }
- }
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- int n = in.nextInt();
- used = new boolean[n];
- c = new int[n];
- g = new ArrayList[n];
- g_rev = new ArrayList[n];
- for (int i = 0; i < n; ++i) {
- g[i] = new ArrayList<>();
- g_rev[i] = new ArrayList<>();
- }
- int m = in.nextInt();
- for (int i = 0; i < m; ++i) {
- int u = in.nextInt();
- int v = in.nextInt();
- --u;
- --v;
- g[u].add(v);
- g_rev[v].add(u);
- }
- for (int i = 0; i < n; ++i) {
- if (!used[i]) {
- dfs1(i);
- }
- }
- Collections.reverse(topSort);
- int color = 1;
- for (int i = 0; i < n; ++i) {
- if (c[topSort.get(i)] == 0) {
- dfs2(topSort.get(i), color++);
- }
- }
- System.out.println(color - 1);
- for (int i = 0; i < n; ++i) {
- System.out.print(c[i] + " ");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement