Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.53 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.util.*;
  6.  
  7. public class E {
  8.     private static int timer;
  9.     private static ArrayList<ArrayList<Pair<Integer, Integer>>> graph;
  10.     private static ArrayList<Integer> times;
  11.     private static ArrayList<Integer> colorEdges;
  12.     private static ArrayList<Boolean> usedEdges;
  13.     private static int cntVertex;
  14.     private static int cntEdges;
  15.     private static Stack<Integer> stack;
  16.     private static int maxColor;
  17.     private static Map<Integer, Integer> multiply;
  18.  
  19.     public static void main(String[] args) {
  20.         graphInit();
  21.         solve();
  22.         print();
  23.     }
  24.  
  25.     private static void graphInit() {
  26.  
  27.         timer = 0;
  28.         maxColor = 0;
  29.         graph = new ArrayList<>();
  30.         times = new ArrayList<>();
  31.         usedEdges = new ArrayList<>();
  32.         colorEdges = new ArrayList<>();
  33.         stack = new Stack<>();
  34.         multiply = new LinkedHashMap<>();
  35.         Map<Pair<Integer, Integer>, Integer> edgesId = new LinkedHashMap<>();
  36.         InputReader scanner = new InputReader(System.in);
  37. //        Scanner scanner = new Scanner(System.in);
  38.         cntVertex = scanner.nextInt();
  39.         cntEdges = scanner.nextInt();
  40.  
  41.         for (int i = 0; i < cntVertex; i++) {
  42.             times.add(0);
  43.             graph.add(new ArrayList<>());
  44.         }
  45.         for (int i = 0; i < cntEdges; i++) {
  46.             colorEdges.add(-1);
  47.             usedEdges.add(false);
  48.             int u = scanner.nextInt() - 1;
  49.             int v = scanner.nextInt() - 1;
  50.             if (!edgesId.containsKey(new Pair<>(u, v))) {
  51.                 edgesId.put(new Pair<>(u, v), i);
  52.                 edgesId.put(new Pair<>(v, u), i);
  53.             } else {
  54.                 multiply.put(i, edgesId.get(new Pair<>(v, u)));
  55.             }
  56.             graph.get(u).add(new Pair<>(v, i));
  57.             graph.get(v).add(new Pair<>(u, i));
  58.         }
  59.     }
  60.  
  61.     private static void solve() {
  62.         for (int i = 0; i < cntVertex; i++) {
  63.             if (times.get(i) == 0) {
  64.                 dfs(i, -1);
  65.             }
  66.         }
  67.     }
  68.  
  69.     private static int dfs(int v, int parent) {
  70.         timer++;
  71.         times.set(v, timer);
  72.         int minTime = timer;
  73.         for (int i = 0; i < graph.get(v).size(); i++) {
  74.             int u = graph.get(v).get(i).getFirst();
  75.             int id = graph.get(v).get(i).getSecond();
  76.  
  77.             if (u != parent) {
  78.                 int t, currentSize = stack.size();
  79.                 if (!usedEdges.get(id)) {
  80.                     stack.add(id);
  81.                     usedEdges.set(id, true);
  82.                 }
  83.                 if (times.get(u) == 0) {
  84.                     t = dfs(u, v);
  85.                     if (t >= times.get(v)) {
  86.                         maxColor++;
  87.                         while (stack.size() != currentSize) {
  88.                             int edge = stack.peek();
  89.                             colorEdges.set(edge, maxColor);
  90.                             stack.pop();
  91.                         }
  92.                     }
  93.                 } else {
  94.                     t = times.get(u);
  95.                 }
  96.                 minTime = Math.min(minTime, t);
  97.             }
  98.         }
  99.         return minTime;
  100.     }
  101.  
  102.     private static void print() {
  103.         System.out.println(maxColor);
  104.         if (multiply.size() != 0) {
  105.             for (int i = 0; i < cntEdges; i++) {
  106.                 int curr = colorEdges.get(i);
  107.                 if (multiply.containsKey(i)) {
  108.                     curr = colorEdges.get(multiply.get(i));
  109.                 }
  110.                 System.out.print(curr + " ");
  111.             }
  112.         } else {
  113.             for (int i = 0; i < cntEdges; i++) {
  114.                 System.out.print(colorEdges.get(i) + " ");
  115.             }
  116.         }
  117.     }
  118.  
  119.     private static class Pair<T, V> {
  120.         private T first;
  121.         private V second;
  122.  
  123.         Pair(T first, V second) {
  124.             this.first = first;
  125.             this.second = second;
  126.         }
  127.  
  128.         T getFirst() {
  129.             return first;
  130.         }
  131.  
  132.         V getSecond() {
  133.             return second;
  134.         }
  135.  
  136.         public void setFirst(T first) {
  137.             this.first = first;
  138.         }
  139.  
  140.         public void setSecond(V second) {
  141.             this.second = second;
  142.         }
  143.  
  144.         @Override
  145.         public boolean equals(Object o) {
  146.             if (this == o) return true;
  147.             if (o == null || getClass() != o.getClass()) return false;
  148.             Pair<?, ?> pair = (Pair<?, ?>) o;
  149.             return Objects.equals(first, pair.first) &&
  150.                     Objects.equals(second, pair.second);
  151.         }
  152.  
  153.         @Override
  154.         public int hashCode() {
  155.             return Objects.hash(first, second);
  156.         }
  157.     }
  158.  
  159.     private static class InputReader {
  160.         BufferedReader reader;
  161.         StringTokenizer tokenizer;
  162.  
  163.         InputReader(InputStream stream) {
  164.             reader = new BufferedReader(new InputStreamReader(stream), 32768);
  165.             tokenizer = null;
  166.         }
  167.  
  168.         String next() {
  169.             while (tokenizer == null || !tokenizer.hasMoreTokens()) {
  170.                 try {
  171.                     tokenizer = new StringTokenizer(reader.readLine());
  172.                 } catch (IOException e) {
  173.                     throw new RuntimeException(e);
  174.                 }
  175.             }
  176.             return tokenizer.nextToken();
  177.         }
  178.  
  179.         public int nextInt() {
  180.             return Integer.parseInt(next());
  181.         }
  182.  
  183.     }
  184.  
  185.  
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement