Advertisement
jasonpogi1669

Dijkstra Algorithm Greedy Approach using Java

Jul 22nd, 2021
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.93 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class Main {
  5.     static Scanner in = new Scanner(System.in);
  6.     static Vector<Vector<Integer>> table_status;
  7.     static Vector<Vector<Boolean>> visited_status;
  8.     static int[] res;
  9.    
  10.     static int ConvertLetter(int n, char starting_vertex, char[] letters) {
  11.         int vertex = -1;
  12.         for (int i = 0; i < n; i++) {
  13.             if (letters[i] == starting_vertex) {
  14.                 vertex = i;
  15.                 break;
  16.             }
  17.         }
  18.         return vertex;
  19.     }
  20.    
  21.     static int GetMinimumDistance(int[] distance, boolean[] visited) {
  22.         int mn = Integer.MAX_VALUE;
  23.         int id = -1;
  24.         for (int i = 0; i < (int) distance.length; i++) {
  25.             if (!visited[i] && distance[i] <= mn) {
  26.                 mn = distance[i];
  27.                 id = i;
  28.             }
  29.         }
  30.         return id;
  31.     }
  32.    
  33.     static Vector<Integer> ConvertIntegerArray(int[] distance) {
  34.         Vector<Integer> temp_1D = new Vector<Integer>();
  35.         for (int i = 0; i < (int) distance.length; i++) {
  36.             temp_1D.add(distance[i]);
  37.         }
  38.         return temp_1D;
  39.     }
  40.    
  41.     static Vector<Boolean> ConvertBooleanArray(boolean[] visited) {
  42.         Vector<Boolean> temp_1D = new Vector<Boolean>();
  43.         for (int i = 0; i < (int) visited.length; i++) {
  44.             temp_1D.add(visited[i]);
  45.         }
  46.         return temp_1D;
  47.     }
  48.    
  49.     static int[] GetShortestPath(int[][] a, int start) {
  50.         int n = (int) a.length;
  51.         table_status = new Vector<Vector<Integer>>();
  52.         visited_status = new Vector<Vector<Boolean>>();
  53.         int[] distance = new int[n];
  54.         boolean[] visited = new boolean[n];
  55.         Arrays.fill(distance, Integer.MAX_VALUE);
  56.         Arrays.fill(visited, false);
  57.         distance[start] = 0;
  58.         table_status.add(ConvertIntegerArray(distance));
  59.         visited[start] = true;
  60.         visited_status.add(ConvertBooleanArray(visited));
  61.         visited[start] = false;
  62.         for (int i = 0; i < n; i++) {
  63.             int origin = GetMinimumDistance(distance, visited);
  64.             visited[origin] = true;
  65.             for (int j = 0; j < n; j++) {
  66.                 int alternative = distance[origin] + a[origin][j];
  67.                 if (!visited[j] && a[origin][j] != 0 && distance[origin] != Integer.MAX_VALUE && alternative < distance[j]) {
  68.                     distance[j] = alternative;
  69.                 }
  70.             }
  71.             table_status.add(ConvertIntegerArray(distance));
  72.             visited_status.add(ConvertBooleanArray(visited));
  73.         }
  74.         return distance;
  75.     }
  76.    
  77.     static void PrintShortestDistance(char starting_vertex, char[] letters, int[] res) {
  78.        
  79.     }
  80.    
  81.     public static void main(String[] args) {
  82.         // get table size
  83.         int n = 0;
  84.         while (true) {
  85.             System.out.print("Enter table size [2, 3, 4, 5, 6]: ");
  86.             n = in.nextInt();
  87.             if (n != 2 && n != 3 && n != 4 && n != 5 && n != 6) {
  88.                 System.out.println("Please try again.");
  89.                 continue;
  90.             }
  91.             break;
  92.         }
  93.         // create corresponding letters
  94.         char[] letters = new char[n];
  95.         for (int i = 0, start = 65; i < n; i++, start++) {
  96.             letters[i] = (char) (start);
  97.         }
  98.         // choose between random or user input
  99.         boolean random = false;
  100.         while (true) {
  101.             System.out.print("\nRandomize values? (Y or N): ");
  102.             char ch = in.next().charAt(0);
  103.             if (ch == 'Y' || ch == 'y') {
  104.                 random = true;
  105.                 break;
  106.             } else if (ch == 'N' || ch == 'n') {
  107.                 break;
  108.             } else {
  109.                 System.out.println("Please try again.");
  110.             }
  111.         }
  112.         // input table
  113.         int[][] a = new int[n][n];
  114.         int start = 1;
  115.         int end = 20;
  116.         if (!random) {
  117.             System.out.println("\nEnter values in [" + n + " x " + n + "] table: ");
  118.         }
  119.         for (int i = 0; i < n; i++) {
  120.             for (int j = 0; j < n; j++) {
  121.                 if (random) {
  122.                     if (i != j) {
  123.                         a[i][j] = (int) Math.floor(Math.random() * (end - start + 1) + start);
  124.                         continue;
  125.                     }
  126.                     a[i][j] = 0;
  127.                 } else {
  128.                     a[i][j] = in.nextInt();
  129.                 }
  130.             }
  131.         }
  132.         // choose starting vertex
  133.         char starting_vertex = 'A';
  134.         while (true) {
  135.             System.out.print("\nChoose starting vertex " + Arrays.toString(letters) + ": ");
  136.             starting_vertex = in.next().charAt(0);
  137.             starting_vertex = Character.toUpperCase(starting_vertex);
  138.             boolean checker = false;
  139.             for (int i = 0; i < n; i++) {
  140.                 if (starting_vertex == letters[i]) {
  141.                     checker = true;
  142.                     break;
  143.                 }
  144.             }
  145.             if (checker) {
  146.                 break;
  147.             }
  148.             System.out.println("Please try again.");
  149.         }
  150.         // print original table
  151.         System.out.println("\nOriginal Table:\n");
  152.         for (int i = 0; i < n; i++) {
  153.             System.out.print("\t" + letters[i]);
  154.         }
  155.         System.out.println("");
  156.         for (int i = 0; i < n; i++) {
  157.             System.out.print(letters[i]);
  158.             for (int j = 0; j < n; j++) {
  159.                 System.out.print("\t" + a[i][j]);
  160.             }
  161.             System.out.println("");
  162.         }
  163.         // find the numerical equivalent of 'starting_vertex'
  164.         int vertex = ConvertLetter(n, starting_vertex, letters);
  165.         // use the algorithm to find the answer
  166.         res = GetShortestPath(a, vertex);
  167.         // print simulation
  168.         System.out.println("\nSimulation:\n");
  169.         for (int i = 0; i < (int) table_status.size(); i++) {
  170.             for (int j = 0; j < (int) table_status.get(i).size(); j++) {
  171.                 int element = table_status.get(i).get(j);
  172.                 System.out.print(letters[j] + ": ");
  173.                 System.out.println((element == Integer.MAX_VALUE ? "INF" : element) + " ");
  174.             }
  175.             System.out.println("\nUnvisited Vertices:\n");
  176.             for (int j = 0; j < (int) visited_status.get(i).size(); j++) {
  177.                 boolean element = visited_status.get(i).get(j);
  178.                 String status = (element ? "Visited" : "Not Yet Visited");
  179.                 System.out.println(letters[j] + ": " + status);
  180.             }
  181.             System.out.println("\n-----\n");
  182.         }
  183.         // print final answer  
  184.         System.out.println("Starting Vertex: " + starting_vertex + "\n");
  185.         for (int i = 0; i < (int) res.length; i++) {
  186.             System.out.println(letters[i] + ": " + (res[i] == Integer.MAX_VALUE ? "INF" : res[i]));
  187.         }
  188.         System.out.println();
  189.     }
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement