Advertisement
trishLEX

dijkstra

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