Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.83 KB | None | 0 0
  1. import java.util.PriorityQueue;
  2. import java.util.Scanner;
  3. import java.io.DataInputStream;
  4. import java.io.InputStream;
  5.  
  6. public class MapRoute {
  7.         private static class Parser {
  8.                 final private int BUFFER_SIZE = 1 << 16;
  9.                 private DataInputStream din;
  10.                 private byte[] buffer;
  11.                 private int bufferPointer, bytesRead;
  12.  
  13.                 public Parser(InputStream in) {
  14.                         din = new DataInputStream(in);
  15.                         buffer = new byte[BUFFER_SIZE];
  16.                         bufferPointer = bytesRead =  0;
  17.                 }
  18.  
  19.                 public int nextInt() {
  20.                         int rst =  0;
  21.                         boolean negative;
  22.                         try {
  23.                                 byte c = read();
  24.                                 while (c <= ' ')
  25.                                         c = read();
  26.                                 negative = c == '-';
  27.                                 if (negative)
  28.                                         c = read();
  29.                                 do {
  30.                                         rst = rst * 10 + c - '0';
  31.                                         c = read();
  32.                                 } while (c > ' ');
  33.  
  34.                                 if (negative) return -rst;
  35.                         } catch (Exception e) {}
  36.                         return rst;
  37.                 }
  38.  
  39.                 private void fillBuffer() {
  40.                         try {
  41.                                 bytesRead = din.read(buffer, bufferPointer =  0, BUFFER_SIZE);
  42.                         } catch (Exception e) {}
  43.                         if (bytesRead == -1) buffer[ 0] = -1;
  44.                 }
  45.  
  46.                 private byte read() {
  47.                         if (bufferPointer == bytesRead) fillBuffer();
  48.                         return buffer[bufferPointer++];
  49.                 }
  50.         }
  51.        
  52.         public static void main(String[] args) {
  53.         Parser in = new Parser(System.in);
  54.         int n = in.nextInt(), i;
  55.         int[] distances = new int[n * n];
  56.         PriorityQueue<Vertex> priorityQueue = new PriorityQueue<>(distances.length);
  57.         Vertex[] vertices = new Vertex[distances.length];
  58.         for (i = 0; i < distances.length; i++) {
  59.             distances[i] = in.nextInt();
  60.             vertices[i] = new Vertex(i);
  61.             priorityQueue.offer(vertices[i]);
  62.         }
  63.         vertices[0].key = distances[0];
  64.         while (!priorityQueue.isEmpty()) {
  65.             i = priorityQueue.poll().value;
  66.             if (i / n == (i + 1) / n) {
  67.                 if (vertices[i + 1].key > vertices[i].key + distances[i + 1]) {
  68.                     priorityQueue.remove(vertices[i + 1]);
  69.                     vertices[i + 1].key = vertices[i].key + distances[i + 1];
  70.                     priorityQueue.offer(vertices[i + 1]);
  71.                 }
  72.             }
  73.             if (i >= n) {
  74.                 if (vertices[i - n].key > vertices[i].key + distances[i - n]) {
  75.                     priorityQueue.remove(vertices[i - n]);
  76.                     vertices[i - n].key = vertices[i].key + distances[i - n];
  77.                     priorityQueue.offer(vertices[i - n]);
  78.                 }
  79.             }
  80.             if (i > 0 && i / n == (i - 1) / n) {
  81.                 if (vertices[i - 1].key > vertices[i].key + distances[i - 1]) {
  82.                     priorityQueue.remove(vertices[i - 1]);
  83.                     vertices[i - 1].key = vertices[i].key + distances[i - 1];
  84.                     priorityQueue.offer(vertices[i - 1]);
  85.                 }
  86.             }
  87.             if (i + n < distances.length) {
  88.                 if (vertices[i + n].key > vertices[i].key + distances[i + n]) {
  89.                     priorityQueue.remove(vertices[i + n]);
  90.                     vertices[i + n].key = vertices[i].key + distances[i + n];
  91.                     priorityQueue.offer(vertices[i + n]);
  92.                 }
  93.             }
  94.         }
  95.         System.out.println(vertices[distances.length - 1].key);
  96.     }
  97.  
  98.     private static class Vertex implements Comparable<Vertex> {
  99.  
  100.         int key, value;
  101.  
  102.         Vertex(int i) {
  103.             value = i;
  104.             key = Integer.MAX_VALUE;
  105.         }
  106.  
  107.         @Override
  108.         public int compareTo(Vertex vertex) {
  109.             return key - vertex.key;
  110.         }
  111.  
  112.     }
  113.  
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement