Advertisement
trishLEX

shortestPath

Oct 22nd, 2017
334
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.76 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class MapRoute {
  4.     private static class Graph {
  5.         private ArrayList<Vertex> vertices;
  6.         private int first;
  7.  
  8.         public Graph(int[][] map, int n) {
  9.             this.vertices = new ArrayList<>();
  10.             this.first = map[0][0];
  11.  
  12.             for (int i = 0; i < n * n; i++)
  13.                 this.vertices.add(new Vertex());
  14.  
  15.             for (int i = 0; i < n; i++) {
  16.                 for (int j = 0; j < n; j++) {
  17.                     if (j < n - 1){
  18.                         this.vertices.get(i + i * (n - 1) + j).to.add(vertices.get(i + i * (n - 1) + j + 1));
  19.                         this.vertices.get(i + i * (n - 1) + j).weights.add(map[i][j + 1]);
  20.                     }
  21.                     if (i < n - 1){
  22.                         this.vertices.get(i + i * (n - 1) + j).to.add(vertices.get(i + i * (n - 1) + j + n));
  23.                         this.vertices.get(i + i * (n - 1) + j).weights.add(map[i + 1][j]);
  24.                     }
  25.                     if (j > 0 && i > 0 && i < n - 1){
  26.                         this.vertices.get(i + i * (n - 1) + j).to.add(vertices.get(i + i * (n - 1) + j - 1));
  27.                         this.vertices.get(i + i * (n - 1) + j).weights.add(map[i][j - 1]);
  28.                     }
  29.                     if (i > 0 && j > 0 && j < n - 1){
  30.                         this.vertices.get(i + i * (n - 1) + j).to.add(vertices.get(i + i * (n - 1) + j - n));
  31.                         this.vertices.get(i + i * (n - 1) + j).weights.add(map[i - 1][j]);
  32.                     }
  33.                 }
  34.             }
  35.         }
  36.     }
  37.  
  38.     private static class Vertex {
  39.         private Vertex parent;
  40.         private double dist;
  41.         private ArrayList<Vertex> to;
  42.         private ArrayList<Integer> weights;
  43.  
  44.         public Vertex() {
  45.             this.parent = null;
  46.             this.dist = Double.POSITIVE_INFINITY;
  47.             this.to = new ArrayList<>();
  48.             this.weights = new ArrayList<>();
  49.         }
  50.     }
  51.  
  52.     private static Comparator<Vertex> distComparator = new Comparator<Vertex>() {
  53.         @Override
  54.         public int compare(Vertex o1, Vertex o2) {
  55.             return (int) (o1.dist - o2.dist);
  56.         }
  57.     };
  58.  
  59.     private static boolean relax(Vertex u, Vertex v, int w) {
  60.         boolean changed = (u.dist + w) < v.dist;
  61.  
  62.         if (changed) {
  63.             v.dist = u.dist + w;
  64.             v.parent = u;
  65.         }
  66.  
  67.         return changed;
  68.     }
  69.  
  70.     private static void dijkstra(ArrayList<Vertex> graph, Vertex s) {
  71.         PriorityQueue<Vertex> q = new PriorityQueue<>(distComparator);
  72.  
  73.         s.dist = 0;
  74.         q.add(graph.get(0));
  75.  
  76.         while(!q.isEmpty()) {
  77.             Vertex v = q.poll();
  78.  
  79. //          for (Vertex u: v.to) {
  80.             for (int i = 0; i < v.to.size(); i++){
  81.                 Vertex u = v.to.get(i);
  82.                 if (relax(v, u, v.weights.get(i))) {
  83.                     q.remove(u);
  84.                     q.add(u);
  85.                 }
  86.             }
  87.         }
  88.     }
  89.  
  90.     private static Graph scanGraph() {
  91.         Scanner in = new Scanner(System.in);
  92.  
  93.         int n = in.nextInt();
  94.         int[][] map = new int[n][n];
  95.         for (int i = 0; i < n; i++)
  96.             for (int j = 0; j < n; j++)
  97.                 map[i][j] = in.nextInt();
  98.  
  99.         Graph graph = new Graph(map, n);
  100.         return graph;
  101.     }
  102.  
  103.     public static void main(String[] args) {
  104.         //long start = System.currentTimeMillis();
  105.  
  106.         Graph graph = scanGraph();
  107.  
  108.         int n = graph.vertices.size();
  109.  
  110.         dijkstra(graph.vertices, graph.vertices.get(0));
  111.  
  112.         System.out.println(((int) graph.vertices.get(n - 1).dist + graph.first));
  113.  
  114.         //long end = System.currentTimeMillis();
  115.  
  116.         //System.out.println((end - start)/1000);
  117.     }
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement