Skip to main content

Shortest Path from source to Vertex :- Dijkstra Algorithm


Shortest Path from source to Vertex :- Dijkstra Algorithm:-

Dijkstra Algorithms is an algorithm use to find the shortest path from source vertex to a given vertex.



package Graph;

import java.util.HashMap;

abstract public class DirectedGraph {

 Vertex[] vertexlist=new Vertex[10];
 HashMap<Character,HashMap<Character,Integer>> edgelist=new HashMap<>();
 Vertex vertex;
 //count of vertex and edge
 static int vertexcount=0;
 int edgecount=0;
 /*
  * This function takes a label and insert in the vertex list as well as edge list since it is new vertex it will add
  * null to its adjoining vertices
  */
 int addVertex(char label)
 {
  vertex=new Vertex(label);
  vertexlist[vertexcount]=vertex;
  System.out.println(vertexlist[vertexcount].label);
  edgelist.put(vertex.label, null);
  vertexcount++;
  return vertexcount;
 }
 
 int addEdge(char label,char[] labels,int[] distances)
 {
  HashMap<Character,Integer> vertexlist=new HashMap<>();
  for(int i=0;i<labels.length;i++)
  {
  vertexlist.put(labels[i], distances[i]);
  }
  edgelist.put(label, vertexlist);
  return edgecount;
 }
 
 int removeEdge(char labelfrom,char labelto)
 {
  edgelist.get(labelfrom).remove(labelto);
  edgecount--;
  return edgecount;
 }
 
 HashMap<Character,Integer> getNeighbours(char label)
 {
  return edgelist.get(label);
 }
 
 void listOfVertex()
 {
  System.out.println("Total Vertex:"+ vertexcount);
  
  //This is how we traverse over a hashmap
  for(Object key:edgelist.keySet())
  {
   System.out.println(key+" " +edgelist.get(key));
  }
  
 }
}


package Graph;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class DirectedGraphImpl extends DirectedGraph {
 
 //Algorithm to search the shortest path
 public void djiksta(DirectedGraphImpl g)
 {
  //Creating new instance of grapg passed in parameter
  DirectedGraphImpl newgraph=new DirectedGraphImpl();
  newgraph=g;
  
  /*
   * Declaring hashmap for holding vertex value in character and distance from source in Integer
   */
  HashMap<Character,Integer> map=new HashMap<>();
  /*
   * Declaring queue to iterate graph in BFS fashion
   */
  Queue<Character> queue=new LinkedList<Character>();
  
  //Initializing new instance of graph with vertex and distance as minimum value
  for(int i=0;i<newgraph.vertexcount;i++)
  {
   map.put(vertexlist[i].label, Integer.MIN_VALUE);
  }
  
  //adding root to the queue
     queue.add(newgraph.vertexlist[0].label);
  
  
  
  while(!queue.isEmpty())
  {
   //checking vertex distance if it minimum distance make it as 0
   if(map.get(queue.peek())==Integer.MIN_VALUE)
   {
    map.put(queue.peek(), 0);
   }
   
   //Storing previous vertex name
   char previousvertex=queue.peek();
   
   //Getting neigbours of previous vertex as well as removing the same from queue tail
   HashMap<Character,Integer> neigbours=newgraph.getNeighbours(queue.remove());
   
   //if neighbours are there
   if(neigbours!=null)
   {
    
    //iterating over neighbours
   for(Character key:neigbours.keySet())
   {
    //Adding neighbour in queue from front
    
    /*
     * checking condition if distance(new vertex from previous vertex)+distance(source to previous vertex)
     * is less than what we have in able assign new distance to the table
     * 
     * 
     * supose from A to B distance is 4
     * from A to C distance is 1 and from C to A distance is 2 then
     * 
     *  A to B 4 will be replaced by 3
     */
    queue.add(key);
    int newvalue=neigbours.get(key)+map.get(previousvertex);
    
    //loop will only run when distance is less or distance not yet defined
    if(newvalue<map.get(key) || map.get(key)==Integer.MIN_VALUE)
    {
     map.put((Character) key, newvalue);
    }
    
   }
   }
   
  }
  
  //calling method to show final matrix of Vertex distance relation
  showShortestDistance(map);
    
 }
 

 
 //Iterating Hash Map to show the shortest distance of vertex from Source
 public void showShortestDistance(HashMap map)
 {
  for(Object key:map.keySet())
  {
   System.out.println(key.toString()+"    "+map.get(key));
  }
 }
 
 
 public static void main(String[] args)
 {
  DirectedGraphImpl dgraph=new DirectedGraphImpl();
  dgraph.addVertex('A');
  dgraph.addVertex('B');
  dgraph.addVertex('C');
  dgraph.addVertex('D');
  dgraph.addVertex('E');
  
  dgraph.addEdge('A', new char[]{'B','C'},new int[]{4,1} );
  dgraph.addEdge('B', new char[]{'E'},new int[]{4} );
  dgraph.addEdge('C', new char[]{'B','D'},new int[]{2,4} );
  dgraph.addEdge('D', new char[]{'E'},new int[]{4} );
  dgraph.listOfVertex();
  System.out.println("shortest distance in a graph using djikstra");
  dgraph.djiksta(dgraph);
  
 }

}

Comments

.

Popular posts from this blog

How to design a Node in Tree?

How to design a Node in Tree?

There are three main components of a tree in a node.

 1) Integer holding data.
2) Left pointer holding node in a left subtree.
3) Right pointer holding node in a right subtree.

The following design is having data of int type and left,right pointers of a node to the subtrees.


package com.BST;publicclassNode{int data; Node left; Node right;/** * @return the data */publicNode(int data){this.left=null;this.right=null;this.data=data;}publicintgetData(){return data;}/** * @param data the data to set */publicvoidsetData(int data){this.data= data;}/** * @return the left */public Node getLeft(){return left;}/** * @param left the left to set */publicvoidsetLeft(Node left){this.left= left;}/** * @return the right */public Node getRight(){return right;}/** * @param right the right to set */publicvoidsetRight(Node right){this.right= right;}/* (non-Javadoc) * @see java.lang.Object#toString() */@Overridepublic String toString(){return"Node [data=&quo…

Heap implementation in JAVA

In this tutorial we will see all the functionalities of heaps implemented through java language.



package com.problems.heap;publicclassHeapFunctions{//Function to generate maxheapify where root is max than childspublicvoidmaxHeapify(int Arr[],int i,int N){int largest;int left =2*i+1;//left childint right =2*i +2;//right child System.out.println("left"+" "+left); System.out.println("right"+" "+right); System.out.println("Max size"+" "+N);if(left< N && Arr[left]> Arr[i]){ largest = left; System.out.println("largest left"+largest);}else{ largest = i; System.out.println("largest i"+largest);}if(right < N && Arr[right]> Arr[largest]){ largest = right; System.out.println("largest right"+largest);}if(largest != i ){ System.out.println("No largest"+largest); Arr=swap (A…