Advertisement
Guest User

CF Gym 102569 Problem D

a guest
Apr 6th, 2020
941
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.40 KB | None | 0 0
  1. import java.awt.*;
  2. import java.io.*;
  3. import java.util.*;
  4. import java.util.List;
  5. import java.util.Queue;
  6.  
  7. public class SM_LexMinPath_AC_Waves {
  8.  
  9.     public static void main(String[] args) {
  10.         new Solution().run();
  11.     }
  12.  
  13.     static class Solution {
  14.         private void read(SolutionReader in) {
  15.             this.n = in.readInt();
  16.             this.m = in.readInt();
  17.             this.graph = new List[n];
  18.             for (int v = 0; v < n; ++v) {
  19.                 graph[v] = new ArrayList<>();
  20.             }
  21.  
  22.             for (int e = 0; e < m; ++e) {
  23.                 int from = in.readInt() - 1;
  24.                 int to = in.readInt() - 1;
  25.                 char letter = in.readString().charAt(0);
  26.  
  27.                 graph[from].add(new Edge(to, letter));
  28.                 graph[to].add(new Edge(from, letter));
  29.             }
  30.         }
  31.  
  32.         class Edge {
  33.             int to;
  34.             char letter;
  35.  
  36.             public Edge(int to, char letter) {
  37.                 this.to = to;
  38.                 this.letter = letter;
  39.             }
  40.         }
  41.  
  42.         int n, m;
  43.         List<Edge>[] graph;
  44.  
  45.         private void process() {
  46.             int[] distances = new int[n];
  47.             Arrays.fill(distances, n);
  48.  
  49.             Queue<Integer> queue = new ArrayDeque<>();
  50.  
  51.             final int end = n - 1;
  52.  
  53.             queue.add(end);
  54.             distances[end] = 0;
  55.  
  56.             while (queue.size() > 0) {
  57.                 int from = queue.poll();
  58.  
  59.                 for (Edge e : graph[from]) {
  60.                     int to = e.to;
  61.                     if (distances[to] > distances[from] + 1) {
  62.                         distances[to] = distances[from] + 1;
  63.                         queue.add(to);
  64.                     }
  65.                 }
  66.             }
  67.  
  68.             final int start = 0;
  69.  
  70.             int[] parents = new int[n];
  71.             Arrays.fill(parents, -1);
  72.  
  73.             List<Integer> curWave = new ArrayList<>();
  74.             curWave.add(start);
  75.  
  76.             StringBuilder answerBuilder = new StringBuilder();
  77.  
  78.             while (true) {
  79.                 char minLetter = 'z';
  80.  
  81.                 boolean lastWave = false;
  82.  
  83.                 for (int from : curWave) {
  84.                     lastWave |= (from == end);
  85.  
  86.                     for (Edge e : graph[from]) {
  87.                         int to = e.to;
  88.                         if (distances[to] == distances[from] - 1) {
  89.                             minLetter = (char)Math.min(minLetter, e.letter);
  90.                         }
  91.                     }
  92.                 }
  93.  
  94.                 if (lastWave) break;
  95.  
  96.                 answerBuilder.append(minLetter);
  97.  
  98.                 List<Integer> nextWave = new ArrayList<>();
  99.                 for (int from : curWave) {
  100.                     for (Edge e : graph[from]) {
  101.                         int to = e.to;
  102.                         if (distances[to] == distances[from] - 1 && e.letter == minLetter) {
  103.                             if (parents[to] == -1) {
  104.                                 parents[to] = from;
  105.                                 nextWave.add(to);
  106.                             }
  107.                         }
  108.                     }
  109.                 }
  110.  
  111.                 curWave = nextWave;
  112.             }
  113.  
  114.             this.path = new ArrayList<>();
  115.             for (int v = end; v != parents[start]; v = parents[v]) {
  116.                 path.add(v);
  117.             }
  118.             Collections.reverse(path);
  119.  
  120.             this.answer = answerBuilder.toString();
  121.         }
  122.  
  123.         List<Integer> path;
  124.         String answer;
  125.  
  126.         private void print(SolutionWriter out) {
  127.             out.print(answer.length()).println()
  128.                     .printIndexes(Utils.castInt(path)).println()
  129.                     .print(answer).println();
  130.         }
  131.  
  132.         private static final boolean FAST_IO = true;
  133.  
  134.         private static SolutionReader createReader() {
  135.             return (FAST_IO ? new FastReader() : new ScannerReader());
  136.         }
  137.  
  138.         private static SolutionWriter createWriter() {
  139.             return new SolutionPrintWriter();
  140.         }
  141.  
  142.         void run() {
  143.             read();
  144.             process();
  145.             print();
  146.         }
  147.  
  148.         private boolean consoleIO = false;
  149.  
  150.         private SolutionReader initReader() {
  151.             SolutionReader reader = createReader();
  152.  
  153.             try {
  154.                 reader.setInput("input.txt");
  155.             } catch (FileNotFoundException e) {
  156.                 reader.setInput(System.in);
  157.                 consoleIO = true;
  158.             }
  159.  
  160.             return reader;
  161.         }
  162.  
  163.         private void read() {
  164.             try (SolutionReader in = initReader()){
  165.                 read(in);
  166.             } catch (IOException ignored) {
  167.  
  168.             }
  169.         }
  170.  
  171.         private SolutionWriter initWriter() {
  172.             SolutionWriter writer = createWriter();
  173.  
  174.             try {
  175.                 if (!consoleIO) {
  176.                     writer.setOutput("output.txt");
  177.                 }
  178.             } catch (IOException e) {
  179.                 consoleIO = true;
  180.             }
  181.  
  182.             if (consoleIO) {
  183.                 writer.setOutput(System.out);
  184.             }
  185.  
  186.             return writer;
  187.         }
  188.  
  189.         private void print() {
  190.             try (SolutionWriter out = initWriter()) {
  191.                 print(out);
  192.             } catch (IOException ignored) {
  193.  
  194.             }
  195.         }
  196.     }
  197.  
  198.     static class Utils {
  199.         static List<Integer> order(int size) {
  200.             List<Integer> order = new ArrayList<>();
  201.             for (int i = 0; i < size; ++i) order.add(i);
  202.             return order;
  203.         }
  204.  
  205.         static int[] castInt(List<Integer> list) {
  206.             int[] array = new int[list.size()];
  207.             for (int i = 0; i < array.length; ++i) {
  208.                 array[i] = list.get(i);
  209.             }
  210.             return array;
  211.         }
  212.  
  213.         static int getBit(int mask, int bit) {
  214.             return ((mask >> bit) & 1);
  215.         }
  216.     }
  217.  
  218.     interface SolutionReader extends Closeable {
  219.  
  220.         void setInput(InputStream input);
  221.         void setInput(FileReader input);
  222.         default void setInput(String fileName) throws FileNotFoundException {
  223.             setInput(new FileReader(fileName));
  224.         }
  225.  
  226.         String readLine();
  227.         String readString();
  228.  
  229.         int readInt();
  230.         default int[] readIntArray(int n) {
  231.             int[] a = new int[n];
  232.             for (int i = 0; i < n; ++i) {
  233.                 a[i] = readInt();
  234.             }
  235.             return a;
  236.         }
  237.  
  238.         default int[] readIntArrayWithDecrease(int n) {
  239.             int[] a = readIntArray(n);
  240.             for (int i = 0; i < n; ++i) a[i]--;
  241.             return a;
  242.         }
  243.  
  244.         long readLong();
  245.         default long[] readLongArray(int n) {
  246.             long[] a = new long[n];
  247.             for (int i = 0; i < n; ++i) {
  248.                 a[i] = readLong();
  249.             }
  250.             return a;
  251.         }
  252.     }
  253.  
  254.     static class ScannerReader implements SolutionReader {
  255.  
  256.         private Scanner in;
  257.  
  258.         @Override
  259.         public void setInput(FileReader input) {
  260.             this.in = new Scanner(input);
  261.         }
  262.  
  263.         @Override
  264.         public void setInput(InputStream input) {
  265.             this.in = new Scanner(input);
  266.         }
  267.  
  268.         @Override
  269.         public String readLine() {
  270.             String result = in.nextLine();
  271.             if (result != null && result.isEmpty()) result = in.nextLine();
  272.             return result;
  273.         }
  274.  
  275.         @Override
  276.         public String readString() {
  277.             return in.next();
  278.         }
  279.  
  280.         @Override
  281.         public int readInt() {
  282.             return in.nextInt();
  283.         }
  284.  
  285.         @Override
  286.         public long readLong() {
  287.             return in.nextLong();
  288.         }
  289.  
  290.         @Override
  291.         public void close() {
  292.             in.close();
  293.         }
  294.     }
  295.  
  296.     static class FastReader implements SolutionReader {
  297.  
  298.         private BufferedReader in;
  299.         private StringTokenizer tok;
  300.  
  301.         private void initTokenizer() {
  302.             this.tok = new StringTokenizer("");
  303.         }
  304.  
  305.         @Override
  306.         public void setInput(FileReader input) {
  307.             this.in = new BufferedReader(input);
  308.             initTokenizer();
  309.         }
  310.  
  311.         @Override
  312.         public void setInput(InputStream input) {
  313.             this.in = new BufferedReader(new InputStreamReader(input));
  314.             initTokenizer();
  315.         }
  316.  
  317.         @Override
  318.         public String readLine() {
  319.             try {
  320.                 return in.readLine();
  321.             } catch (IOException e) {
  322.                 throw new RuntimeException(e);
  323.             }
  324.         }
  325.  
  326.         @Override
  327.         public String readString() {
  328.             while (!tok.hasMoreTokens()) {
  329.                 String nextLine = readLine();
  330.                 if (nextLine == null) return null;
  331.                 tok = new StringTokenizer(nextLine);
  332.             }
  333.  
  334.             return tok.nextToken();
  335.         }
  336.  
  337.         @Override
  338.         public int readInt() {
  339.             return Integer.parseInt(readString());
  340.         }
  341.  
  342.         @Override
  343.         public long readLong() {
  344.             return Long.parseLong(readString());
  345.         }
  346.  
  347.         @Override
  348.         public void close() throws IOException {
  349.             in.close();
  350.         }
  351.     }
  352.  
  353.     interface SolutionWriter extends Closeable {
  354.  
  355.         void setOutput(PrintStream out);
  356.         void setOutput(FileWriter out);
  357.  
  358.         default void setOutput(String fileName) throws IOException {
  359.             setOutput(new FileWriter(fileName));
  360.         }
  361.  
  362.         SolutionWriter println();
  363.  
  364.         SolutionWriter print(String line);
  365.         default SolutionWriter printSpace() {
  366.             return print(" ");
  367.         }
  368.  
  369.         SolutionWriter print(int value);
  370.         SolutionWriter print(long value);
  371.         SolutionWriter print(double value);
  372.  
  373.         default SolutionWriter printAll(int... values) {
  374.             for (int value : values) {
  375.                 print(value).printSpace();
  376.             }
  377.             return this;
  378.         }
  379.  
  380.         default SolutionWriter printAll(Iterable<Integer> values) {
  381.             for (int value : values) {
  382.                 print(value).printSpace();
  383.             }
  384.             return this;
  385.         }
  386.  
  387.         default SolutionWriter printIndexes(int... indexes) {
  388.             for (int index : indexes) {
  389.                 print(index + 1).printSpace();
  390.             }
  391.             return this;
  392.         }
  393.  
  394.         default SolutionWriter printAllSeparated(int... values) {
  395.             for (int value : values) {
  396.                 print(value).println();
  397.             }
  398.             return this;
  399.         }
  400.  
  401.         default SolutionWriter printPointsSeparated(Point[] points) {
  402.             for (Point point : points) {
  403.                 printAll(point.x, point.y).println();
  404.             }
  405.             return this;
  406.         }
  407.  
  408.         default SolutionWriter printAll(long... values) {
  409.             for (long value : values) {
  410.                 print(value).printSpace();
  411.             }
  412.             return this;
  413.         }
  414.  
  415.         default SolutionWriter printAll(double... values) {
  416.             for (double value : values) {
  417.                 print(value).printSpace();
  418.             }
  419.             return this;
  420.         }
  421.     }
  422.  
  423.     static class SolutionPrintWriter implements SolutionWriter {
  424.  
  425.         private PrintWriter out;
  426.  
  427.         @Override
  428.         public void setOutput(PrintStream out) {
  429.             this.out = new PrintWriter(out);
  430.         }
  431.  
  432.         @Override
  433.         public void setOutput(FileWriter out) {
  434.             this.out = new PrintWriter(out);
  435.         }
  436.  
  437.         @Override
  438.         public SolutionWriter println() {
  439.             out.println();
  440.             return this;
  441.         }
  442.  
  443.         @Override
  444.         public SolutionWriter print(String line) {
  445.             out.print(line);
  446.             return this;
  447.         }
  448.  
  449.         @Override
  450.         public SolutionWriter print(int value) {
  451.             out.print(value);
  452.             return this;
  453.         }
  454.  
  455.         @Override
  456.         public SolutionWriter print(long value) {
  457.             out.print(value);
  458.             return this;
  459.         }
  460.  
  461.         @Override
  462.         public SolutionWriter print(double value) {
  463.             out.printf(Locale.US, "%.12f", value);
  464.             return this;
  465.         }
  466.  
  467.         @Override
  468.         public void close() {
  469.             out.close();
  470.         }
  471.     }
  472. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement