NikitaM

Untitled

Nov 18th, 2023
1,165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.85 KB | None | 0 0
  1. package graph;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.util.ArrayDeque;
  6. import java.util.ArrayList;
  7. import java.util.Arrays;
  8. import java.util.Comparator;
  9. import java.util.Deque;
  10. import java.util.HashMap;
  11. import java.util.List;
  12. import java.util.Map;
  13. import java.util.PriorityQueue;
  14. import java.util.stream.Collectors;
  15.  
  16. import java.io.BufferedReader;
  17. import java.io.BufferedWriter;
  18. import java.io.File;
  19. import java.io.IOException;
  20. import java.io.InputStreamReader;
  21. import java.io.OutputStreamWriter;
  22. import java.util.StringTokenizer;
  23.  
  24. import java.io.FileReader;
  25. import java.math.BigDecimal;
  26. import java.math.BigInteger;
  27.  
  28. class OptimizedScanner {
  29.     private BufferedReader br;
  30.     private StringTokenizer st;
  31.  
  32.     public OptimizedScanner() {
  33.         br = new BufferedReader(new InputStreamReader(System.in));
  34.     }
  35.  
  36.     public OptimizedScanner(File file) throws IOException {
  37.         br = new BufferedReader(new FileReader(file));
  38.     }
  39.  
  40.     public boolean ready() throws IOException {
  41.         return (br.ready() || st.hasMoreTokens());
  42.     }
  43.  
  44.     public String next() {
  45.         while (st == null || !st.hasMoreTokens()) {
  46.             try {
  47.                 st = new StringTokenizer(br.readLine());
  48.             } catch (IOException e) {
  49.                 e.printStackTrace();
  50.             }
  51.         }
  52.  
  53.         return st.nextToken();
  54.     }
  55.  
  56.     public int nextInt() {
  57.         return Integer.parseInt(next());
  58.     }
  59.  
  60.     public long nextLong() {
  61.         return Long.parseLong(next());
  62.     }
  63.  
  64.     public void close() {
  65.         try {
  66.             br.close();
  67.         } catch (IOException e) {
  68.             e.printStackTrace();
  69.         }
  70.     }
  71. }
  72.  
  73. class OptimizedWriter {
  74.     private BufferedWriter bw;
  75.  
  76.     public OptimizedWriter() {
  77.         bw = new BufferedWriter(new OutputStreamWriter(System.out));
  78.     }
  79.  
  80.     public <T> void write(T value) {
  81.         try {
  82.             bw.write(value.toString());
  83.         } catch (IOException e) {
  84.             e.printStackTrace();
  85.         }
  86.     }
  87.  
  88.     public <T> void writeln(T value) {
  89.         try {
  90.             bw.write(value.toString());
  91.             bw.write('\n');
  92.         } catch (IOException e) {
  93.             e.printStackTrace();
  94.         }
  95.     }
  96.  
  97.     public <T> void writeNext(T value) {
  98.         write(value);
  99.         write(' ');
  100.     }
  101.  
  102.     public <T> void writeIterable(Iterable<T> iterable) {
  103.         for (T item : iterable) {
  104.             writeNext(item);
  105.         }
  106.  
  107.         write('\n');
  108.     }
  109.  
  110.     public void writelnArray(byte[] array) {
  111.         for (byte item : array) {
  112.             writeNext(item);
  113.         }
  114.  
  115.         write('\n');
  116.     }
  117.  
  118.     public void writelnArray(short[] array) {
  119.         for (short item : array) {
  120.             writeNext(item);
  121.         }
  122.  
  123.         write('\n');
  124.     }
  125.  
  126.     public void writelnArray(int[] array) {
  127.         for (int item : array) {
  128.             writeNext(item);
  129.         }
  130.  
  131.         write('\n');
  132.     }
  133.  
  134.     public void writelnArray(long[] array) {
  135.         for (long item : array) {
  136.             writeNext(item);
  137.         }
  138.  
  139.         write('\n');
  140.     }
  141.  
  142.     public void writelnArray(float[] array) {
  143.         for (float item : array) {
  144.             writeNext(item);
  145.         }
  146.  
  147.         write('\n');
  148.     }
  149.  
  150.     public void writelnArray(double[] array) {
  151.         for (double item : array) {
  152.             writeNext(item);
  153.         }
  154.  
  155.         write('\n');
  156.     }
  157.  
  158.     public void writelnArray(char[] array) {
  159.         for (char item : array) {
  160.             writeNext(item);
  161.         }
  162.  
  163.         write('\n');
  164.     }
  165.  
  166.     public void writelnArray(boolean[] array) {
  167.         for (boolean item : array) {
  168.             writeNext(item);
  169.         }
  170.  
  171.         write('\n');
  172.     }
  173.  
  174.     public void writelnArray(BigInteger[] array) {
  175.         for (BigInteger item : array) {
  176.             writeNext(item);
  177.         }
  178.  
  179.         write('\n');
  180.     }
  181.  
  182.     public void writelnArray(BigDecimal[] array) {
  183.         for (BigDecimal item : array) {
  184.             writeNext(item);
  185.         }
  186.  
  187.         write('\n');
  188.     }
  189.  
  190.     public void close() {
  191.         try {
  192.             bw.flush();
  193.             bw.close();
  194.         } catch (IOException e) {
  195.             e.printStackTrace();
  196.         }
  197.     }
  198. }
  199.  
  200. public class ProblemE {
  201.     public static void main(String[] args) {
  202. //      OptimizedScanner scanner = new OptimizedScanner();
  203.         File file = new File("graph_input_e.txt");
  204.         OptimizedScanner scanner = null;
  205.         OptimizedWriter writer = new OptimizedWriter();
  206.  
  207.         try {
  208.             scanner = new OptimizedScanner(file);
  209.         } catch (IOException e) {
  210.             e.printStackTrace();
  211.         }
  212.  
  213.         int n = scanner.nextInt();
  214.         List<Integer> prep_time = new ArrayList<>();
  215.         List<Integer> speeds = new ArrayList<>();
  216.         int[][] roads = new int[n][n];
  217.        
  218.         for (int i = 0; i < n; i++) {
  219.             for (int j = 0; j < n; j++) {
  220.                 if (i != j) {
  221.                     roads[i][j] = -1;
  222.                 }
  223.             }
  224.         }
  225.  
  226.         for (int i = 0; i < n; i++) {
  227.             int t = scanner.nextInt();
  228.             int v = scanner.nextInt();
  229.             prep_time.add(t);
  230.             speeds.add(v);
  231.         }
  232.  
  233.         for (int i = 0; i < n - 1; i++) {
  234.             int a = scanner.nextInt();
  235.             int b = scanner.nextInt();
  236.             int s = scanner.nextInt();
  237.             roads[a - 1][b - 1] = s;
  238.             roads[b - 1][a - 1] = s;
  239.         }
  240.  
  241.         List<List<Pair<Integer, Double>>> full_graph = new ArrayList<>();
  242.        
  243.         for (int i = 0; i < n; i++) {
  244.             full_graph.add(new ArrayList<>());
  245.         }
  246.  
  247.         for (int city = 1; city < n; city++) {
  248.             full_graph.set(city, bfs(roads, city, speeds, prep_time));
  249.         }
  250.        
  251.         double latest_time = 0;
  252.         int[] latest_path = null;
  253.        
  254. //       for (int i = 0; i < full_graph.size(); i++) {
  255. //         for (int j = 0; j < full_graph.get(i).size(); j++) {
  256. //             Pair <Integer, Double> pair = full_graph.get(i).get(j);
  257. //                  System.out.println((i + 1) + " to " + (pair.getKey() + 1) + ": " + pair.getValue());
  258. //         }
  259. //       }
  260.  
  261.         for (int city = 0; city < 1; city++) {
  262.             Pair<Double, int[]> result = dijkstra(full_graph, city);
  263.             double travel_time = result.getKey();
  264.             int[] path = result.getValue();
  265.            
  266.             if (travel_time > latest_time) {
  267.                 latest_time = travel_time;
  268.                 latest_path = path;
  269.             }
  270.         }
  271.  
  272.         writer.writeln(String.format("%.10f", latest_time));
  273.  
  274.         for (int city : latest_path) {
  275.             writer.writeNext(city);
  276.         }
  277.  
  278.         scanner.close();
  279.         writer.close();
  280.     }
  281.    
  282.     public static List<Pair<Integer, Double>> bfs(int[][] roads, int city, List<Integer> speeds, List<Integer> prepTime) {
  283.         Map<Integer, Double> distances = new HashMap<>();
  284.         distances.put(city, 0.0);
  285.  
  286.         Deque<Pair<Double, Integer>> queue = new ArrayDeque<>();
  287.         queue.add(new Pair<>(0.0, city));
  288.        
  289.         while (!queue.isEmpty()) {
  290.             Pair<Double, Integer> pair = queue.poll();
  291.             double time = pair.getKey();
  292.             int currentCity = pair.getValue();
  293.  
  294.             if (currentCity == 0) {
  295.                 break;
  296.             }
  297.            
  298.             for (int i = 0; i < roads[currentCity].length; i++) {
  299.                 int targetCity = i;
  300.                 int roadLength = roads[currentCity][i];
  301.                
  302.                 if (currentCity == targetCity || roadLength == -1)
  303.                     continue;
  304.                
  305.                 double newTime = time + roadLength;
  306.  
  307.                 if (!distances.containsKey(targetCity) || newTime < distances.get(targetCity)) {
  308.                     distances.put(targetCity, newTime);
  309.                     queue.add(new Pair<>(newTime, targetCity));
  310.                 }
  311.             }
  312.         }
  313.  
  314.         List<Pair<Integer, Double>> result = new ArrayList<>();
  315.        
  316.         for (Map.Entry<Integer, Double> entry : distances.entrySet()) {
  317.             int target = entry.getKey();
  318.             double travelTime = entry.getValue() / speeds.get(city) + prepTime.get(city);
  319.            
  320.             if (target != city) {
  321.                 result.add(new Pair<>(target, travelTime));
  322.             }
  323.         }
  324.  
  325.         return result;
  326.     }
  327.    
  328.     public static Pair<Double, int[]> dijkstra(List<List<Pair<Integer, Double>>> graph, int start) {
  329.         int n = graph.size();
  330.         double[] distance = new double[n];
  331.         Arrays.fill(distance, Double.POSITIVE_INFINITY);
  332. //        distance[start] = 0.0;
  333.  
  334.         PriorityQueue<Pair<Double, Integer>> queue = new PriorityQueue<>((a, b) -> Double.compare(a.getKey(), b.getKey()));
  335.         queue.offer(new Pair<Double, Integer>(0.0, start));
  336.  
  337.         int[] paths = new int[n];
  338.         Arrays.fill(paths, -1);
  339.         boolean[] visited = new boolean[n];
  340.  
  341.         while (!queue.isEmpty()) {
  342.             Pair<Double, Integer> curr = queue.poll();
  343.             double dist = curr.getKey();
  344.             int current = curr.getValue();
  345.  
  346.             if (visited[current]) {
  347.                 continue;
  348.             }
  349.  
  350.             visited[current] = true;
  351.            
  352. //            if (current == n - 1) {
  353. //                break;
  354. //            }
  355.            
  356.             for (int i = 0; i < graph.size(); i++) {
  357.                 if (!graph.get(i).isEmpty() && current < graph.get(i).size()) {
  358.                     Pair<Integer, Double> neighbor = graph.get(i).get(current);
  359.                     int neighborIndex = neighbor.getKey();
  360.                     double weight = neighbor.getValue();
  361.                     dist = distance[neighborIndex];
  362.                     dist = (dist == Double.POSITIVE_INFINITY) ? 0.0 : dist;
  363. //                  System.out.println("Current: " + (current + 1) + ", i: " + (i + 1) + ", neighborIndex: " + (neighborIndex + 1));
  364. //                    
  365. //                    System.out.println("From " + (neighborIndex + 1) + " to " + (i + 1) + ", weight: " + weight);
  366. //                    System.out.println(dist + " + " + weight + " < " + distance[i]);
  367.                    
  368.                     if (dist + weight < distance[i]) {
  369.                         distance[i] = dist + weight;
  370.                         paths[i] = neighborIndex;
  371.                         queue.offer(new Pair<Double, Integer>(distance[i], i));
  372.                     }
  373.                 }
  374.             }
  375.         }
  376.  
  377.         double maxDistance = Double.NEGATIVE_INFINITY;
  378.         int maxDistanceCity = -1;
  379.        
  380.         for (int i = 1; i < n; i++) {
  381.            
  382.             if (distance[i] > maxDistance)
  383.                 maxDistanceCity = i;
  384.            
  385.             maxDistance = Math.max(distance[i], maxDistance);
  386.         }
  387.        
  388.         // System.out.println("Max: " + maxDistanceCity + ", Distance: " + maxDistance);
  389.        
  390.         List<Integer> maxDistancePath = new ArrayList<>();
  391.        
  392.         int current = maxDistanceCity;
  393.        
  394.         while (current != -1) {
  395.             maxDistancePath.add(current + 1);
  396.             current = paths[current];
  397.         }
  398.        
  399.         int[] result = new int[maxDistancePath.size()];
  400.        
  401.         for (int i = 0; i < maxDistancePath.size(); i++) {
  402.             result[i] = maxDistancePath.get(i);
  403.         }
  404.        
  405.         return new Pair<Double, int[]>(maxDistance, result);
  406.     }
  407.    
  408.     static class Pair<K, V> {
  409.         private K key;
  410.         private V value;
  411.  
  412.         public Pair(K key, V value) {
  413.             this.key = key;
  414.             this.value = value;
  415.         }
  416.  
  417.         public K getKey() {
  418.             return key;
  419.         }
  420.  
  421.         public V getValue() {
  422.             return value;
  423.         }
  424.     }
  425. }
  426.  
Advertisement
Add Comment
Please, Sign In to add comment