Added Java Implementation of Dijkstras Algorithm for Single Source Shortest Path (#187)

* Added Java Implementation of Dijkstras Algorithm for Single Source Shortest Path

* Added changes to Dijkstras Algorithm Implementation according to review

* Corrected spelling mistakes
pull/194/head
JACOB JAMES K 2021-04-15 00:24:00 +05:30 committed by GitHub
parent 6cb96b0d44
commit 2f86af8736
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 137 additions and 0 deletions

View File

@ -5,3 +5,7 @@
1. [Kruskal Algorithm](c-or-cpp/kruskal-algorithm.cpp)
2. [Bellman Ford Algorithm](c-or-cpp/bellman-ford.cpp)
3. [Prim's Algorithm](c-or-cpp/Prim's-algorithm.c)
### Java
1. [Dijkstras Algorithm](java/Dijkstras.java)

View File

@ -0,0 +1,133 @@
import java.util.*;
class AdjListNode
{
int dest;
int weight;
AdjListNode(int dest,int weight)
{
this.dest=dest;
this.weight=weight;
}
}
class NodeComparator implements Comparator<AdjListNode>
{
@Override
public int compare(AdjListNode node1, AdjListNode node2)
{
if (node1.weight < node2.weight)
return -1;
if (node1.weight > node2.weight)
return 1;
return 0;
}
}
class Dijkstras
{
public int[] dijkstras(List<List<AdjListNode>> adj_list,int source)
{
int[] distance = new int[adj_list.size()];
Set<Integer> completed = new HashSet<Integer>();
for(int i=0;i<distance.length;++i)
{
distance[i] = Integer.MAX_VALUE;
}
PriorityQueue<AdjListNode> pq = new PriorityQueue<>(adj_list.size(),new NodeComparator());
AdjListNode source_node = new AdjListNode(source,0);
for(int i=0;i<distance.length;++i)
{
pq.add(new AdjListNode(i,Integer.MAX_VALUE));
}
pq.add(source_node);
distance[source]=0;
while(!pq.isEmpty())
{
AdjListNode current = pq.remove();
if(!completed.contains(current.dest))
{
completed.add(current.dest);
for(AdjListNode n :adj_list.get(current.dest) )
{
if( distance[n.dest] > (distance[current.dest]+n.weight))
{
distance[n.dest] = distance[current.dest]+n.weight;
pq.add(new AdjListNode(n.dest, distance[n.dest]));
}
}
}
}
return distance;
}
public static void main(String args[])
{
/*
SAMPLE INPUT AND OUTPUT
___________________________
Input:
__________
Please enter the number of nodes N. Vertices will be [0,N-1]
6
Please Enter the number of Edges
9
Please enter each edge in the sequence <starting node> <destination node> <weight>
0 1 1
0 2 5
1 2 2
1 4 1
1 3 2
2 4 2
3 5 1
3 4 3
4 5 2
Please enter source vertex
0
Output:
___________
Distances from source 0
Node0--->0
Node1--->1
Node2--->3
Node3--->3
Node4--->2
Node5--->4
*/
List<List<AdjListNode>> adj_list = new ArrayList<List<AdjListNode>>();
System.out.println("Please enter the number of nodes N. Vertices will be [0,N-1]");
Scanner sc = new Scanner(System.in);
int v = sc.nextInt();
for(int i=0;i<v;++i)
adj_list.add(new ArrayList<AdjListNode>());
System.out.println("Please enter the number of edges");
int e = sc.nextInt();
System.out.println("Please enter each edge in the sequence <starting node> <destination node> <weight>");
// Sample Data: 0 2 5 (edge from 0 to 2 with weight 5)
for(int i=0;i<e;++i)
{
int startnode = sc.nextInt();
int destnode = sc.nextInt();
int weight = sc.nextInt();
adj_list.get(startnode).add(new AdjListNode(destnode,weight));
}
int source;
System.out.println("Please enter source vertex");
source = sc.nextInt();
Dijkstras d = new Dijkstras();
int[] distances = d.dijkstras(adj_list, source); //source vertex is taken as 0
System.out.println("Distances from source "+source);
for(int i=0;i<distances.length;++i)
{
if(distances[i]==Integer.MAX_VALUE)
System.out.println("Node"+i+"--->"+"infinity");
else
System.out.println("Node"+i+"--->"+distances[i]);
}
}
}