Advertisement
Guest User

Java

a guest
Jun 19th, 2019
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.69 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. // Data structure to store graph edges
  4. class Edge {
  5.     int source, dest, weight;
  6.  
  7.     public Edge(int source, int dest, int weight) {
  8.         this.source = source;
  9.         this.dest = dest;
  10.         this.weight = weight;
  11.     }
  12. };
  13.  
  14. // Data structure to store heap nodes
  15. class Node {
  16.     int vertex, weight;
  17.  
  18.     public Node(int vertex, int weight) {
  19.         this.vertex = vertex;
  20.         this.weight = weight;
  21.     }
  22. }
  23.  
  24. // class to represent a graph object
  25. class Graph {
  26.     // A List of Lists to represent an adjacency list
  27.     List<List<Edge>> adjList = null;
  28.  
  29.     // Constructor
  30.     Graph(List<Edge> edges, int N) {
  31.         adjList = new ArrayList<>(N);
  32.  
  33.         for (int i = 0; i < N; i++) {
  34.             adjList.add(i, new ArrayList<>());
  35.         }
  36.  
  37.         // add edges to the undirected graph
  38.         for (Edge edge : edges) {
  39.             adjList.get(edge.source).add(edge);
  40.         }
  41.     }
  42. }
  43.  
  44. class Dijkstra {
  45.  
  46.     public static ArrayList<Integer> bestRoute = new ArrayList<>();
  47.  
  48.     private static void calculateRoute(int prev[], int i) {
  49.         if (i < 0)
  50.             return;
  51.         calculateRoute(prev, prev[i]);
  52.         bestRoute.add(i);
  53.         //  System.out.print(i + " ");
  54.     }
  55.  
  56.     // Run Dijkstra's algorithm on given graph
  57.     public static ArrayList<Integer> shortestPath(Graph graph, int start, int finish, int N) {
  58.         // create min heap and push start node having distance 0
  59.         PriorityQueue<Node> minHeap = new PriorityQueue<>(
  60.                 (lhs, rhs) -> lhs.weight - rhs.weight);
  61.  
  62.         minHeap.add(new Node(start, 0));
  63.  
  64.         // set infinite distance from start to v initially
  65.         List<Integer> dist = new ArrayList<>(
  66.                 Collections.nCopies(N, Integer.MAX_VALUE));
  67.  
  68.         // distance from start to itself is zero
  69.         dist.set(start, 0);
  70.  
  71.         // boolean array to track vertices for which minimum
  72.         // cost is already found
  73.         boolean[] done = new boolean[N];
  74.         done[start] = true;
  75.  
  76.         // stores predecessor of a vertex (to print path)
  77.         int prev[] = new int[N];
  78.         prev[start] = -1;
  79.  
  80.         // run till minHeap is not empty
  81.         while (!minHeap.isEmpty()) {
  82.             // Remove and return best vertex
  83.             Node node = minHeap.poll();
  84.  
  85.             // get vertex number
  86.             int u = node.vertex;
  87.  
  88.             // do for each neighbor v of u
  89.             for (Edge edge : graph.adjList.get(u)) {
  90.                 int v = edge.dest;
  91.                 int weight = edge.weight;
  92.  
  93.                 // Relaxation step
  94.                 if (!done[v] && (dist.get(u) + weight) < dist.get(v)) {
  95.                     dist.set(v, dist.get(u) + weight);
  96.                     prev[v] = u;
  97.                     minHeap.add(new Node(v, dist.get(v)));
  98.                 }
  99.             }
  100.  
  101.             // marked vertex u as done so it will not get picked up again
  102.             done[u] = true;
  103.         }
  104.  
  105.  
  106.         // dist.get(finish)
  107.         calculateRoute(prev, finish);
  108.         return bestRoute;
  109.     }
  110.  
  111.     public static void main(String[] args) {
  112.         // initialize edges as per above diagram
  113.         // (u, v, w) triplet represent undirected edge from
  114.         // vertex u to vertex v having weight w
  115.         List<Edge> edges = Arrays.asList(
  116.                 new Edge(0, 1, 43), new Edge(0, 5, 30),
  117.                 new Edge(1, 0, 43), new Edge(1, 2, 126), new Edge(1, 6, 30),
  118.                 new Edge(2, 1, 126), new Edge(2, 3, 43), new Edge(2, 7, 30),
  119.                 new Edge(3, 2, 43), new Edge(3, 9, 90), new Edge(3, 4, 43),
  120.                 new Edge(4, 3, 43), new Edge(4, 10, 90),
  121.                 new Edge(5, 0, 30), new Edge(5, 6, 43), new Edge(5, 8, 60),
  122.                 new Edge(6, 1, 30), new Edge(6, 5, 43), new Edge(6, 7, 126),
  123.                 new Edge(7, 6, 126), new Edge(7, 2, 30),
  124.                 new Edge(8, 5, 60), new Edge(8, 9, 210), new Edge(8, 13, 60),
  125.                 new Edge(9, 3, 90), new Edge(9, 10, 43), new Edge(9, 12, 30), new Edge(9, 8, 210),
  126.                 new Edge(10, 4, 90), new Edge(10, 9, 43), new Edge(10, 15, 60),
  127.                 new Edge(11, 14, 30), new Edge(11, 12, 170),
  128.                 new Edge(12, 9, 30), new Edge(12, 11, 170),
  129.                 new Edge(13, 8, 60), new Edge(13, 14, 43),
  130.                 new Edge(14, 13, 43), new Edge(14, 11, 30), new Edge(14, 15, 210),
  131.                 new Edge(15, 14, 210), new Edge(15, 10, 60)
  132.         );
  133.  
  134.         // Set number of vertices in the graph
  135.         final int N = 16;
  136.  
  137.         // construct graph
  138.         Graph graph = new Graph(edges, N);
  139.         ArrayList<Integer> integers = shortestPath(graph, 13, 5, N);
  140.  
  141.         System.out.println(integers);
  142.     }
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement