Advertisement
Guest User

lab5_part1

a guest
Mar 31st, 2020
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.88 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.util.*;
  4.  
  5. import static java.lang.System.exit;
  6.  
  7. public class Main {
  8.  
  9.     public static void main(String[] args) {
  10.  
  11.         try {
  12.             Scanner scanner = new Scanner(new File("./src/input.txt"));
  13.  
  14.             Integer n = scanner.nextInt();
  15.             Integer m = scanner.nextInt();
  16.  
  17.             ArrayList<ArrayList<Pair<Integer>>> list = new ArrayList<>();
  18.             for (Integer i = 0; i < n + 1; i++) {
  19.                 list.add(new ArrayList<>());
  20.             }
  21.  
  22.             for (Integer i = 0; i < m; i++) {
  23.                 Integer first = scanner.nextInt();
  24.                 Integer second = scanner.nextInt();
  25.                 Integer weight = scanner.nextInt();
  26.                 list.get(first).add(new Pair<Integer>(second, weight));
  27.             }
  28.  
  29.             Graph graph = new Graph(list);
  30.  
  31.             while (true) {
  32.                 System.out.println(" 1 - distance FROM => TO \n 2 - distances from given vertex \n 3 - Floyd \n 4 - terminate");
  33.  
  34.                 Scanner consoleScanner = new Scanner(System.in);
  35.  
  36.                 Integer input = consoleScanner.nextInt();
  37.  
  38.                 switch (input) {
  39.                     case 1: {
  40.                         System.out.println("Dijkstra FROM => TO, enter two vertices: FROM, TO");
  41.                         Integer from = consoleScanner.nextInt();
  42.                         Integer to = consoleScanner.nextInt();
  43.  
  44.                         graph.dijkstra(from, to);
  45.                         break;
  46.                     }
  47.                     case 2: {
  48.                         System.out.println("Dijkstra from giver vertex, enter vertex");
  49.                         Integer v = consoleScanner.nextInt();
  50.  
  51.                         graph.dijkstra2(v);
  52.                         break;
  53.                     }
  54.                     case 3: {
  55.                         System.out.println("Floyd FROM => TO + all shortest paths, enter two vertices: FROM, TO");
  56.                         Integer from = consoleScanner.nextInt();
  57.                         Integer to = consoleScanner.nextInt();
  58.  
  59.                         graph.floyd(from, to);
  60.                         break;
  61.                     }
  62.                     case 4: {
  63.                         exit(0);
  64.                     }
  65.  
  66.                 }
  67.             }
  68.  
  69.         } catch (FileNotFoundException ex) {
  70.             ex.printStackTrace();
  71.         };
  72.     }
  73. }
  74.  
  75. class Graph {
  76.  
  77.     private ArrayList<ArrayList<Pair<Integer> > > graph;
  78.     private ArrayList<Boolean> used;
  79.  
  80.     Graph(ArrayList<ArrayList<Pair<Integer> > > graph) {
  81.         for (ArrayList<Pair<Integer>> list : graph) {
  82.             list.sort(new Comparator<Pair<Integer>>() {
  83.                 @Override
  84.                 public int compare(Pair<Integer> int1, Pair<Integer> int2) {
  85.                     if (int1.equals(int2)) {
  86.                         return 0;
  87.                     } else if (int1.first < int2.second) {
  88.                         return -1;
  89.                     } else {
  90.                         return 1;
  91.                     }
  92.                 }
  93.             });
  94.         }
  95.  
  96.         this.graph = graph;
  97.     }
  98.  
  99.     /**
  100.      * Dijkstra, FROM => TO
  101.      * @param from
  102.      * @param to
  103.      */
  104.     public void dijkstra(Integer from, Integer to) {
  105.         Integer INF = 1000000000 + 7;
  106.         ArrayList<Integer> dist = new ArrayList<>(Collections.nCopies(graph.size(), INF));
  107.         dist.set(from, 0);
  108.         TreeSet<Pair<Integer>> st = new TreeSet<Pair<Integer>>();
  109.         st.add(new Pair<Integer> (dist.get(from), from));
  110.         ArrayList<Integer> history = new ArrayList<>(Collections.nCopies(graph.size(), INF));
  111.         while (!st.isEmpty()) {
  112.             Integer v = st.first().second;
  113.             st.remove(st.first());
  114.  
  115.             for (Pair<Integer> _to : graph.get(v)) {
  116.                 Integer __to = _to.first;
  117.                 Integer len = _to.second;
  118.  
  119.                 if (dist.get(v) + len < dist.get(__to)) {
  120.                     st.remove(new Pair<Integer>(dist.get(__to), __to));
  121.                     dist.set(__to, dist.get(v) + len);
  122.                     if (dist.get(v) + len < 0) {
  123.                         throw new IllegalArgumentException("Edge cannot have weight less than 0");
  124.                     }
  125.                     history.set(__to, v);
  126.                     st.add(new Pair<Integer>(dist.get(__to), __to));
  127.                 }
  128.             }
  129.         }
  130.  
  131.         System.out.println("Len: " + dist.get(to));
  132.         ArrayList<Integer> way = new ArrayList<Integer>();
  133.         for (Integer p = to; p != from; p = history.get(p)) {
  134.             way.add(p);
  135.         }
  136.         way.add(from);
  137.         for (Integer i = way.size() - 1; i >= 0; i--) {
  138.             System.out.print(way.get(i));
  139.             if (i != 0)
  140.                 System.out.print("->");
  141.         }
  142.         System.out.println();
  143.     }
  144.  
  145.     /**
  146.      * Dijkstra from ONE to ALL
  147.      * @param from
  148.      */
  149.     public void dijkstra2(Integer from) {
  150.         Integer INF = 1000000000 + 7;
  151.         ArrayList<Integer> dist = new ArrayList<>(Collections.nCopies(graph.size(), INF));
  152.         dist.set(from, 0);
  153.         TreeSet<Pair<Integer>> st = new TreeSet<Pair<Integer>>();
  154.         st.add(new Pair<Integer> (dist.get(from), from));
  155.         ArrayList<Integer> history = new ArrayList<>(Collections.nCopies(graph.size(), INF));
  156.         while (!st.isEmpty()) {
  157.             Integer v = st.first().second;
  158.             st.remove(st.first());
  159.  
  160.             for (Pair<Integer> _to : graph.get(v)) {
  161.                 Integer __to = _to.first;
  162.                 Integer len = _to.second;
  163.  
  164.                 if (dist.get(v) + len < dist.get(__to)) {
  165.                     st.remove(new Pair<Integer>(dist.get(__to), __to));
  166.                     dist.set(__to, dist.get(v) + len);
  167.                     if (dist.get(v) + len < 0) {
  168.                         throw new IllegalArgumentException("Edge cannot have weight less than 0");
  169.                     }
  170.                     history.set(__to, v);
  171.                     st.add(new Pair<Integer>(dist.get(__to), __to));
  172.                 }
  173.             }
  174.         }
  175.  
  176.         for (int i=1; i<dist.size(); i++) {
  177.             if (dist.get(i) == 1000000007)
  178.                 System.out.println("Vertex: " + i + " distance: " + "unreachable");
  179.             else
  180.                 System.out.println("Vertex: " + i + " distance: " + dist.get(i));
  181.         }
  182.     }
  183.  
  184.     /**
  185.      * Floyd from ALL to ALL + FROM => TO
  186.      * @param from
  187.      * @param to
  188.      */
  189.     public void floyd(Integer from, Integer to) {
  190.         Integer INF = 1000000007;
  191.         ArrayList<ArrayList<Integer>> dist = new ArrayList<>();
  192.         Integer GRAPH_SIZE = graph.size() - 1;
  193.         for (Integer i = 0; i < GRAPH_SIZE; i++) {
  194.             dist.add(new ArrayList<>(Collections.nCopies(GRAPH_SIZE, INF)));
  195.         }
  196.  
  197.         for (int i=0; i<GRAPH_SIZE; i++) {
  198.             for (int j = 0; j < graph.get(i+1).size(); j++) {
  199.                 dist.get(i).set(graph.get(i+1).get(j).first-1, graph.get(i+1).get(j).second);
  200.             }
  201.         }
  202.  
  203.         for (int i=0; i<GRAPH_SIZE; i++)
  204.             dist.get(i).set(i, 0);
  205.  
  206.         ArrayList<ArrayList<Integer>> history = new ArrayList<>();
  207.         for (Integer i = 0; i < GRAPH_SIZE; i++) {
  208.             history.add(new ArrayList<>(Collections.nCopies(GRAPH_SIZE, 0)));
  209.         }
  210.  
  211.         for (int i=0; i<GRAPH_SIZE; i++) {
  212.             for (int j=0; j<GRAPH_SIZE; j++) {
  213.                 if (i != j)
  214.                     history.get(i).set(j, i);
  215.                 else
  216.                     history.get(i).set(j, 0);
  217.             }
  218.         }
  219.  
  220.         for (int k=0; k<GRAPH_SIZE; k++) {
  221.             System.out.println("Dist matrix on step " + k + ":");
  222.             for (int i=0; i<GRAPH_SIZE; i++) {
  223.                 for (int j=0; j<GRAPH_SIZE; j++) {
  224.                     if (dist.get(i).get(j) == INF)
  225.                         System.out.print("∞" + " ");
  226.                     else
  227.                         System.out.print(dist.get(i).get(j) + " ");
  228.                 }
  229.                 System.out.println();
  230.             }
  231.  
  232.             System.out.println("History matrix on step " + k + ":");
  233.             for (int i=0; i<GRAPH_SIZE; i++) {
  234.                 for (int j=0; j<GRAPH_SIZE; j++) {
  235.                     if (i == j)
  236.                         System.out.print(0 + " ");
  237.                     else
  238.                         System.out.print(history.get(i).get(j) + 1 + " ");
  239.                 }
  240.                 System.out.println();
  241.             }
  242.             for (int i=0; i<GRAPH_SIZE; i++) {
  243.                 for (int j=0; j<GRAPH_SIZE; j++) {
  244.                     if (dist.get(i).get(k) < INF && dist.get(k).get(j) < INF) {
  245.                         if (dist.get(i).get(k) + dist.get(k).get(j) < dist.get(i).get(j)){
  246.                             dist.get(i).set(j, dist.get(i).get(k) + dist.get(k).get(j));
  247.                             history.get(i).set(j, history.get(k).get(j));
  248.                         }
  249.                     }
  250.                 }
  251.             }
  252.         }
  253.  
  254.         System.out.println("Dist matrix:");
  255.         for (int i=0; i<GRAPH_SIZE; i++) {
  256.             for (int j=0; j<GRAPH_SIZE; j++) {
  257.                 if (dist.get(i).get(j) == INF)
  258.                     System.out.print("∞" + " ");
  259.                 else
  260.                     System.out.print(dist.get(i).get(j) + " ");
  261.             }
  262.             System.out.println();
  263.         }
  264.  
  265.         System.out.println("History matrix:");
  266.         for (int i=0; i<GRAPH_SIZE; i++) {
  267.             for (int j=0; j<GRAPH_SIZE; j++) {
  268.                 if (i == j)
  269.                     System.out.print(0 + " ");
  270.                 else
  271.                     System.out.print(history.get(i).get(j) + 1 + " ");
  272.             }
  273.             System.out.println();
  274.         }
  275.  
  276.         for (int i=0; i<GRAPH_SIZE; i++) {
  277.             for (int j=0; j<GRAPH_SIZE; j++) {
  278.                 if (dist.get(i).get(j) + dist.get(j).get(i) < 0)
  279.                     throw new IllegalArgumentException("Cycle with negative weight exists");
  280.             }
  281.         }
  282.  
  283.         ArrayList<Integer> way = new ArrayList<>();
  284.         Integer idx = to;
  285.         while (idx != from) {
  286.             idx = history.get(from).get(idx);
  287.             way.add(idx + 1);
  288.         }
  289.         way.add(from);
  290.  
  291.         System.out.println("Way: ");
  292.         for (int i=way.size()-1; i>=0; i--)
  293.             System.out.print(way.get(i) + " ");
  294.         System.out.println();
  295.     }
  296. }
  297.  
  298. class Pair<T extends Comparable<T>> implements Comparable<Pair<T>> {
  299.     public T first;
  300.     public T second;
  301.  
  302.     Pair(T first, T second) {
  303.         this.first = first;
  304.         this.second = second;
  305.     }
  306.  
  307.     @Override
  308.     public int compareTo(Pair<T> pair) {
  309.         if (this.first == pair.first) {
  310.             return this.second.compareTo(pair.second);
  311.         } else {
  312.             return this.first.compareTo(pair.first);
  313.         }
  314.     }
  315. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement