Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.22 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3. class Vertex {
  4.     private int number;
  5.     private int distance;
  6.     private Vertex previous;
  7.     private HashMap<Integer, Integer> edges;
  8.  
  9.     public Vertex(int vertex) {
  10.         this.number = vertex;
  11.         this.distance = Integer.MAX_VALUE;
  12.         this.previous = null;
  13.         this.edges = new HashMap<>();
  14.     }
  15.  
  16.     public int getNumber() {
  17.         return number;
  18.     }
  19.  
  20.     public int getDistance() {
  21.         return distance;
  22.     }
  23.  
  24.     public void setDistance(int distance) {
  25.         this.distance = distance;
  26.     }
  27.  
  28.     public Vertex getPrevious() {
  29.         return previous;
  30.     }
  31.  
  32.     public void setPrevious(Vertex previous) {
  33.         this.previous = previous;
  34.     }
  35.  
  36.     public HashMap<Integer, Integer> getEdges() {
  37.         return edges;
  38.     }
  39.  
  40.     public void setEdges(HashMap<Integer, Integer> edges) {
  41.         this.edges = edges;
  42.     }
  43.  
  44.     public String toString() {
  45.         return Integer.toString(number) + "/" + Integer.toString(distance);
  46.     }
  47.  
  48. }
  49.  
  50. class VertexComparator implements Comparator<Vertex> {
  51.     @Override
  52.     public int compare(Vertex o1, Vertex o2) {
  53.         return o1.getDistance() - o2.getDistance();
  54.     }
  55. }
  56.  
  57.  
  58. class Solution{
  59.     public static int n;
  60.     public static int m;
  61.     public static int begin;
  62.     public static int end;
  63.     public static HashMap<Integer, Vertex> graph;
  64.     public static PriorityQueue<Vertex> notVisited;
  65.  
  66.  
  67.     // Implement the solve method to return the answer to the problem posed by the inputstream.
  68.     public String solve(InputStream in) {
  69.         BufferedReader br = null;
  70.         br = new BufferedReader(new InputStreamReader(in));
  71.  
  72.         Comparator<Vertex> compare = new VertexComparator();
  73.         notVisited = new PriorityQueue<>(1, compare);
  74.  
  75.         String[] s = new String[0];
  76.         try {
  77.             s = br.readLine().split(" ");
  78.         } catch (IOException e) {
  79.             e.printStackTrace();
  80.         }
  81.  
  82.         n = Integer.parseInt(s[0]);
  83.         graph = new HashMap<>(n);
  84.        
  85.         m = Integer.parseInt(s[1]);
  86.  
  87.         begin = Integer.parseInt(s[2]);
  88.  
  89.         for(int i = 1; i <= n; i++){
  90.             Vertex v = new Vertex(i);
  91.             graph.put(i, v);
  92.             if(i == begin){
  93.                 v.setDistance(0);
  94.             }
  95.             notVisited.add(v);
  96.         }
  97.  
  98.         end = Integer.parseInt(s[3]);;
  99.  
  100.         if(begin == end || m == 0) {
  101.             try {
  102.                 br.close();
  103.             } catch (IOException e) {
  104.                 e.printStackTrace();
  105.             }
  106.             return "0";
  107.         }
  108.  
  109.         String read = null;
  110.         try {
  111.             while((read = br.readLine()) != null) {
  112.                 String[] s2 = read.split(" ");
  113.                 int v = Integer.parseInt(s2[0]);
  114.                 graph.get(v).getEdges().put(Integer.parseInt(s2[1]), Integer.parseInt(s2[2]));
  115.             }
  116.         } catch (IOException e) {
  117.             e.printStackTrace();
  118.         }
  119.  
  120. //        System.out.println(notVisited.toString());
  121. //        System.out.println(graph.toString());
  122.  
  123.  
  124.         return new Solution().recur();
  125.     }
  126.  
  127.     public String recur() {
  128.         if(notVisited.isEmpty()){
  129.             return "-1";
  130.         }
  131.  
  132.         Vertex min = null;
  133.  
  134.         while(!notVisited.isEmpty()) {
  135.             min = notVisited.poll();
  136.  
  137.             if(min.getNumber() == end)
  138.                 break;
  139.  
  140.             if (!min.getEdges().isEmpty()) {
  141.                 for (Map.Entry<Integer, Integer> child : min.getEdges().entrySet()) {
  142.                     Vertex edge = graph.get(child.getKey());
  143.                     int diff = min.getDistance() + child.getValue() + min.getEdges().size();
  144.  
  145.                     if (diff < edge.getDistance()) {
  146.                         notVisited.remove(edge);
  147.                         edge.setDistance(diff);
  148.                         edge.setPrevious(min);
  149.                         notVisited.add(edge);
  150.                     }
  151.                 }
  152.             }
  153.         }
  154.      
  155.        
  156.         return Integer.toString(min.getDistance());
  157.     }
  158.   // You can leave the following method unchanged.
  159.   public static String run(InputStream in) {
  160.     return new Solution().solve(in);
  161.   }
  162. }
  163. //
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement