Implement Dijkstras algorithm using the graph class you impl
Implement
Dijkstra’s algorithm using the graph class you implemented in
HW
#5 and
a priority
queue
you have
implemented
earlier this semester
.
Y
ou
r
program will read the graph from a text file like
what we did in
HW
#
5
. You can use
graph.txt from HW
#5
to test your program. Make the header of
the method as Dijsktra(G, v), where v is the starting vertex.
Further, write a method that prints the
shortest path betw
een any two vertices. Example: s
hortestPath(G,
x
,
y
).
Write a main method t
o test
your program.
Instructions:
1.
Y
ou can use C#
or Java programming languages. No other language is allowed or accepted
HW#5 Question
Q1)
(6
0 points)
Implement a
graph ADT by defining a class “Graph” with the operations
below. You
r
ADT should accept either a directed or undirected graph.
isDirect():
tests if the graph is a digraph
. Returns Boolean value.
adjacent(v,
u): tests whether there is an edge from the vertex v to u. returns Boolean value.
n
eighbors(v): returns the list of all vertices that are a destination of an edge from v.
addVertex(v): adds the vertex v to the graph if it is not already in the
graph, otherwise an error
message to be thrown.
removeVertex(v): removes vertex v from the graph, if it is there.
When a vertex is removed, all
edges associated with that vertex should be deleted as well.
addEdge(v,
u): adds the edge that starts from v and
ends at u.
addEdge(v, u, w):
adds the edge t
hat starts from v and ends at u with weight w.
removeEdge(v,
u): remove the edge that connects v and u.
getWeight
(v,
u): returns the weight of the edge from v to u.
setWeight
(v,
u): sets the weight of the edge
from v to u.
isEmpty(): check whether the graph is empty or not.
isComplete(): checks whether the graph is complete or not.
vertices():returns the list of vertices in the graph (i.e
.
, array, vector,..)
edges(): returns the list of edges in the graph.
d
egree(v): return the degree of vertex v.
size(): returns the number of vertices in the graph.
nEdges(): returns the number of edges in the graph.
c
lear(): Reinitializes the graph to be empty, freeing any heap storage.
vertexExists(v): tests whether a verte
x is in the graph or not. Returns true or false.
p
rint(): displays the list of vertices, edges and their weights if the graph is weighted.
Your ADT should contain at least these constructors:
Graph(), creates a graph with zero vertices.
Graph(n), creates
a graph with n vertices.
Graph(n, digraph), where digraph is a Boolean value if true means
a
directed graph.
Q2) (50 points)
Write a main method that r
ead
s
the graph.txt file that contains the information of
directed weighted
graph.
The file is formatted
as the following:
First line is the number of vertices in the graph.
Second line contains the vertices in the graph.
Each
following line contains the edges and the weights. For example: a b 4, means an ed
ge from a to be with
weight = 4.
After
reading the f
ile and creating
the graph perform the following operations in the same order:
•
removeVertex(h)
•
print if the graph is complete or not (i.e., the graph is complete or the graph is not complete)
•
print number of edges in the graph (i.e., number of edges is xx)
•
print if there is a link from a to f (i.e., there is a link from a to f or there is no link from a to f)
•
print the weight of the edge b
à
h (i.e., the weight of the edge from b to h is xx)
•
print the degree of c (i.e., the degree of c is xx)
•
print number of
vertices in the graph (i.e., the graph contains xx vertices)
•
addVertex(k)
•
add(k,a,5)
•
add (g, k, 2)
•
setWeight(a, c, 7)
•
print the graph on the screen. Use the same format in the graph.txt to display information about
the graph on the screen
HW#5 answer
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace Bond_HW5
{
public class Vertex
{
public string name;
public double distance;
public List<Edge> edges;
public Vertex()
{
name = \"\";
edges = new List<Edge>();
}
public Vertex(string nm)
{
this.name = nm;
edges = new List<Edge>();
}
}
public class Edge
{
public Vertex target;
public double weight;
public Edge()
{
target = null;
weight = 0;
}
public Edge(Vertex target, double weight)
{
this.target = target;
this.weight = weight;
}
}
public class Graph
{
Vertex[] graph;
int nVertices;
bool isdirected;
public Graph()
{
nVertices = 0;
graph = new Vertex[nVertices];
isdirected = false;
}
public Graph(int n)
{
isdirected = false;
this.nVertices = n;
graph = new Vertex[nVertices];
}
public Graph(int n, bool digraph)
{
isdirected = digraph;
this.nVertices = n;
graph = new Vertex[nVertices];
}
public bool isDirect()
{
if (this.isdirected == true)
{
return true;
}
else
{
return false;
}
}
public bool adjacent(Vertex v, Vertex u)
{
bool vexists = vertexExists(v);
bool uexists = vertexExists(u);
if(vexists && uexists)
{
if (v.edges.Exists(x => x.target.name == u.name))
{
return true;
}
else
{
return false;
}
}
else
return false;
}
public List<Vertex> neighbors(Vertex v)
{
List < Vertex > a = new List<Vertex>();
foreach (Edge e in v.edges.ToArray())
{
a.Add(e.target);
}
return a ;
}
public void addVertex(Vertex v)
{
if(this.vertexExists(v))
{
Console.WriteLine(\"Error, vertex already exists\");
}
else
{
if(graph[0]== null)
{
graph[0] = v;
}
else
{
int i = 1;
while(graph[i]!= null && i < nVertices)
{
i++;
}
if(i>= nVertices)
{
Console.WriteLine(\"Graph full\");
}
else
{
graph[i] = v;
}
}
}
}
public void removeVertex(Vertex v)
{
for (int i = 0; i < nVertices; i++)
{
if (graph[i] != null)
{
if (this.graph[i].name == v.name)
{
graph[i] = null;
}
}
}
}
public void addEdge(Vertex v, Vertex u)
{
bool vexists = vertexExists(v);
bool uexists = vertexExists(u);
if (vexists && uexists)
{
if (isdirected == true)
{
Edge vu = new Edge(u, 0);
v.edges.Add(vu);
}
else
{
Edge vu = new Edge(u, 0);
Edge uv = new Edge(v, 0);
v.edges.Add(vu);
u.edges.Add(uv);
}
}
else if (vexists == true && uexists == false)
{
Console.WriteLine(\"Error: Vertex \'u\' does not exist, please add using the addVertex Function\");
}
else if (vexists == false && uexists == true)
{
Console.WriteLine(\"Error: Vertex \'v\' does not exist, please add using the addVertex Function\");
}
else if (vexists == false && uexists == false)
{
Console.WriteLine(\"Error: Neither vertex exist, please add using the addVertex Function\");
}
}
public void addEdge(Vertex v, Vertex u, int w)
{
bool vexists = vertexExists(v);
bool uexists = vertexExists(u);
if (vexists && uexists)
{
if (isdirected == true)
{
for (int i = 0; i < nVertices; i++)
{
if (graph[i] != null && graph[i].name == v.name)
{
Edge vu = new Edge(u, w);
graph[i].edges.Add(vu);
}
}
}
else
{
Edge vu = new Edge(u, w);
Edge uv = new Edge(v, w);
v.edges.Add(vu);
u.edges.Add(uv);
}
}
else if (vexists == true && uexists == false)
{
Console.WriteLine(\"Error: Vertex \'u\' does not exist, please add using the addVertex Function\");
}
else if (vexists == false && uexists == true)
{
Console.WriteLine(\"Error: Vertex \'v\' does not exist, please add using the addVertex Function\");
}
else if (vexists == false && uexists == false)
{
Console.WriteLine(\"Error: Neither vertex exist, please add using the addVertex Function\");
}
}
public double getWeight(Vertex v, Vertex u)
{
Edge temp = new Edge();
for(int i = 0; i <nVertices; i++)
{
if(graph[i] == null || graph[i].name != v.name)
{
continue;
}
else if(graph[i].name == v.name)
{
temp = graph[i].edges.Find(x => x.target.name == u.name);
}
}
return temp.weight;
}
public void setWeight(Vertex v, Vertex u, double w)
{
Edge temp = new Edge();
if (isdirected)
{
for (int i = 0; i < nVertices; i++)
{
if (graph[i] == null || graph[i].name != v.name)
{
continue;
}
else if (graph[i].name == v.name)
{
temp = graph[i].edges.Find(x => x.target.name == u.name);
temp.weight = w;
}
}
}
else
{
for (int i = 0; i < nVertices; i++)
{
if (graph[i] == null || graph[i].name != v.name)
{
continue;
}
else if (graph[i].name == v.name)
{
temp = graph[i].edges.Find(x => x.target.name == u.name);
temp.weight = w;
}
}
for (int j = 0; j < nVertices; j++)
{
if (graph[j] == null || graph[j].name != u.name)
{
continue;
}
else if (graph[j].name == u.name)
{
temp = graph[j].edges.Find(y => y.target.name == u.name);
temp.weight = w;
}
}
}
}
public bool isEmpty()
{
if (nVertices == 0)
return true;
else
return false;
}
public bool isComplete()
{
Edge[] a;
double sum = 0;
double n = graph.Length;
foreach (Vertex x in graph)
{
if (x != null)
{
a = x.edges.ToArray();
sum += a.Length;
}
}
if(sum < ((n*(n-1)/2)))
{
return false;
}
else
return true;
}
public Vertex[] vertices()
{
return graph;
}
public string edges()
{
string elist = \"\";
Edge[] arr;
foreach (Vertex x in graph)
{
if (x != null)
{
arr = x.edges.ToArray();
for (int i = 0; i < arr.Length; i++)
{
if (arr[i].target != null)
{
elist = elist+x.name + arr[i].target.name + \"(\"+arr[i].weight+\")\";
elist += \"|\";
}
}
}
}
return elist;
}
public int degree(Vertex V)
{
if (isdirected)
{
int counter = 0;
for (int i = 0; i < nVertices; i++)
{
if (graph[i] != null && graph[i].name == V.name)
{
foreach (Edge e in graph[i].edges)
{
counter++;
}
}
}
return counter;
}
else
{
int counter = 0;
for (int i = 0; i < nVertices; i++)
{
if (graph[i] != null && graph[i].name == V.name)
{
foreach (Edge e in graph[i].edges)
{
counter++;
}
}
}
return counter;
}
}
public double size()
{
return graph.Length;
}
public double Nedges()
{
Edge[] a;
double sum = 0;
double n = graph.Length;
foreach (Vertex x in graph)
{
if (x != null)
{
a = x.edges.ToArray();
sum += a.Length;
}
}
if (isdirected)
{
return sum;
}
else
{
return sum / 2;
}
}
public void clear()
{
for (int i = 0; i < nVertices; i++)
{
graph[i] = null;
}
}
public bool vertexExists(Vertex v)
{
for(int i =0; i< nVertices; i++)
{
if (graph[i] != null)
{
if (graph[i].name == v.name)
return true;
}
else
{
continue;
}
}
return false;
}
public void print()
{
Console.WriteLine(\"Vertices: \");
foreach (Vertex v in graph)
{
if (v != null)
{
Console.WriteLine(\"name: \" + v.name);
}
}
Console.WriteLine(\"Edges: \");
Console.WriteLine(edges());
}
}
class Program
{
static void Main(string[] args)
{
/*
Graph a = new Graph(10, false);
Vertex b = new Vertex();
Vertex c = new Vertex();
c.name = \"c\";
b.name = \"b\";
a.addVertex(b);
a.addVertex(c);
a.addEdge(b, c, 10);
a.print();*/
// INput from txt file
StreamReader Reader = new StreamReader(\"graph.txt\");
int numvert;
string[] vertchars;
List<string> edgecreator = new List<string>();
numvert = int.Parse(Reader.ReadLine());
vertchars = new string[numvert];
Graph myGraph = new Graph(numvert, true);
string thechars = Reader.ReadLine();
vertchars = thechars.Split(\' \');
foreach(string character in vertchars)
{
Vertex adder = new Vertex(character);
myGraph.addVertex(adder);
}
string edgeReader;
while((edgeReader = Reader.ReadLine())!= null)
{
edgecreator.Add(edgeReader);
}
string[] b = edgecreator.ToArray();
foreach(string sent in b)
{
string[] splitter = sent.Split(\' \');
Vertex a = new Vertex(splitter[0]);
Vertex c = new Vertex(splitter[1]);
myGraph.addEdge(a, c, int.Parse(splitter[2]));
}
Vertex tester = new Vertex();
Vertex tester2 = new Vertex();
//print the weight of edge b to h
tester.name = \"b\";
tester2.name = \"h\";
double theWeight = myGraph.getWeight(tester, tester2);
Console.WriteLine(\"The weight from b->h is {0}\", theWeight);
//remove vertex h
myGraph.removeVertex(tester2);
//print whether or not the graph is complete
bool comp = myGraph.isComplete();
if(comp)
{
Console.WriteLine(\"the graph is complete\");
}
else
{
Console.WriteLine(\"the graph is not complete\");
}
//print whethether there is a link from a to f
tester = new Vertex(\"a\");
tester2 = new Vertex(\"f\");
comp = myGraph.adjacent(tester, tester2);
if (comp)
{
Console.WriteLine(\"there is a link from a to f\");
}
else
{
Console.WriteLine(\"there is not a link from a to f\");
}
//print the degree of c
Vertex tester3 = new Vertex(\"c\");
Console.WriteLine(\"the out degree of c is {0}\", myGraph.degree(tester3));
//print number of vertices
Console.WriteLine(\"The number of vertices is {0}\", myGraph.vertices().Length);
//add vertex k
tester2 = new Vertex(\"k\");
myGraph.addVertex(tester2);
//add edge k,a,5
myGraph.addEdge(tester2, tester);
//add edge g k 2
Vertex tester4 = new Vertex(\"g\");
myGraph.addEdge(tester4, tester2);
//set weight a,c,7
myGraph.setWeight(tester, tester3, 7);
//print graph
myGraph.print();
}
}
}
Solution
Please Find the Solution in Java
import java.io.*;
 import java.util.*;
 class Edge
 {
 public int dest;
 public int weight;
 public Edge(int dest,int weight)
 {
 this.dest=dest;
 this.weight=weight;
 }
 }
 class Graph
 {
 public int V;
 LinkedList<Edge>[] myList;
 public Graph(int V)
 {
 this.V=V;
 myList=new LinkedList[V+1];
 for(int i=1;i<=V;i++)
 myList[i]=new LinkedList();
 }
 public void addEdge(int src,int dest,int weight)
 {
 Edge e1=new Edge(dest,weight);
 Edge e2=new Edge(src,weight);
 myList[src].add(e1);
 myList[dest].add(e2);
 }
 }
 class Node
 {
 public int value;
 public int dist;
 public Node(int value,int dist)
 {
 this.value=value;
 this.dist=dist;
 }
 }
 class minHeap
 {
 public int capacity;
 public int size;
 Node[] heap;
 int[] pos;
 public minHeap(int capacity)
 {
 this.capacity=capacity;
 this.size=capacity;
 heap=new Node[capacity+1];
 pos=new int[capacity+1];
 for(int i=0;i<capacity;i++)
 {
   
 heap[i]=new Node(i+1,Integer.MAX_VALUE);
 pos[i+1]=i;
 }
 }
 public int left(int index)
 {
 return 2*index+1;
 }
 public int right(int index)
 {
 return 2*index+2;
 }
 public int parent(int index)
 {
 return ((index-1)/2);
 }
 public void decreaseKey(Node nd)
 {
 int index=pos[nd.value];
 if(nd.dist<heap[index].dist)
 {
 heap[index]=nd;
 while(index>0&&heap[parent(index)].dist>heap[index].dist)
  {
 pos[heap[parent(index)].value]=index;
 pos[heap[index].value]=parent(index);
 Node temp=heap[parent(index)];
 heap[parent(index)]=heap[index];
 heap[index]=temp;
 index=parent(index);
 }
 }
 }
 public Node extractMin()
 {
 if(size==1)
 {
 size=0;
 return heap[0];
 }
 else
 {
 Node root=heap[0];
 Node leaf=heap[size-1];
 heap[0]=leaf;
 pos[root.value]=size-1;
 pos[leaf.value]=0;
 min_hippfy(0);
 size=size-1;
 return root;
 }
   
 }
 public void min_hippfy(int i)
 {
 int left=left(i);
 int right=right(i);
 int smallest=i;
 if(left<=(size-1)&&heap[left].dist<heap[smallest].dist)
  {
 smallest=left;
 }
 if(right<=(size-1)&&heap[right].dist<heap[smallest].dist)
  {
 smallest=right;
 }
 if(smallest!=i)
 {
 Node temp1=heap[smallest];
 Node temp2=heap[i];
 heap[smallest]=temp2;
 heap[i]=temp1;
 pos[temp1.value]=i;
 pos[temp2.value]=smallest;
 min_hippfy(smallest);
 }
 }
 public boolean isInHeap(int x)
 {
 if(x<size)return true;
 else return false;
 }
 }
 public class Main
 {
 public static void main(String[] args)
 {
 Scanner in=new Scanner(System.in);
 int n=in.nextInt(); // Number of Nodes starting with 1
 int m=in.nextInt();       // Number of Edges
 Graph g=new Graph(n);
 for(int i=0;i<m;i++)
 {
 int x=in.nextInt(); //From Node
 int y=in.nextInt();   //To Node
 int w=in.nextInt(); //Weight
 g.addEdge(x,y,w);       //Add Edge
 }
 int s=in.nextInt(); //Can use any Node as Start Node
 minHeap mp=new minHeap(n);
 Node firstNode=new Node(s,0);
 mp.decreaseKey(firstNode);
 int[] distance=new int[n+1]; //Result, Shortest Distance from given Start Node
 while(mp.size!=0)
 {
 Node u=mp.extractMin();
 distance[u.value]=u.dist;
 Iterator<Edge> j=g.myList[u.value].iterator();
 while(j.hasNext())
 {
 Edge adj=j.next();
 if(mp.isInHeap(mp.pos[adj.dest])&&u.dist!=Integer.MAX_VALUE&&adj.weight+u.dist<mp.heap[mp.pos[adj.dest]].dist)
  {
 Node adjNode=new Node(adj.dest,adj.weight+u.dist);
 mp.decreaseKey(adjNode);
 }
 }
 }
 for(int i=1;i<=n;i++)
 {
 if(distance[i]==Integer.MAX_VALUE)
 System.out.print(\"-1 \");
 else
 {
 if(i!=s)
 System.out.print(distance[i]+\" \");
 }
 }
 System.out.println();
 }
 }
Sample Input
4 4
 1 2 24
 1 4 20
 3 1 3
 4 3 12
 1
Output:
























