Algorithms_in_C++ 1.0.0
Set of algorithms implemented in C++.
Loading...
Searching...
No Matches
dijkstra.cpp File Reference

Dijkstra algorithm implementation More...

#include <cassert>
#include <climits>
#include <iostream>
#include <vector>
Include dependency graph for dijkstra.cpp:

Classes

class  greedy_algorithms::dijkstra::Graph
 Wrapper class for storing a graph. More...
 

Namespaces

namespace  greedy_algorithms
 for std::vector
 

Functions

int greedy_algorithms::dijkstra::minimum_distance (std::vector< int > mdist, std::vector< bool > vset, int V)
 Utility function that finds the vertex with the minimum distance in mdist.
 
void greedy_algorithms::dijkstra::print (std::vector< int > dist, int V)
 Utility function to print the distances to vertices.
 
void greedy_algorithms::dijkstra::dijkstra (Graph graph, int src)
 The main function that finds the shortest path from a given source to all other vertices using Dijkstra's Algorithm.
 
static void tests ()
 Self-test implementations.
 
int main ()
 Main function.
 

Detailed Description

Dijkstra algorithm implementation

Quote from Wikipedia.

Dijkstra's algorithm is an algorithm for finding the shortest paths between nodes in a weighted graph, which may represent, for example, road networks. It was conceived by computer scientist Edsger W. Dijkstra in 1956 and published three years later.

Author
David Leal
Arpan Jain

Function Documentation

◆ dijkstra()

void greedy_algorithms::dijkstra::dijkstra ( Graph graph,
int src )

The main function that finds the shortest path from a given source to all other vertices using Dijkstra's Algorithm.

Note
This doesn't work on negative weights.
Parameters
graphthe graph to be processed
srcthe source of the given vertex
Returns
void
124 {
125 int V = graph.vertexNum;
126 std::vector<int> mdist{}; // Stores updated distances to the vertex
127 std::vector<bool> vset{}; // `vset[i]` is true if the vertex `i` is included in the shortest path tree
128
129 // Initialize `mdist and `vset`. Set the distance of the source as zero
130 for (int i = 0; i < V; i++) {
131 mdist[i] = INT_MAX;
132 vset[i] = false;
133 }
134
135 mdist[src] = 0;
136
137 // iterate to find the shortest path
138 for (int count = 0; count < V - 1; count++) {
139 int u = minimum_distance(mdist, vset, V);
140
141 vset[u] = true;
142
143 for (int v = 0; v < V; v++) {
144 if (!vset[v] && graph.edges[u][v] &&
145 mdist[u] + graph.edges[u][v] < mdist[v]) {
146 mdist[v] = mdist[u] + graph.edges[u][v];
147 }
148 }
149 }
150
151 print(mdist, V);
152}
int minimum_distance(std::vector< int > mdist, std::vector< bool > vset, int V)
Utility function that finds the vertex with the minimum distance in mdist.
Definition dijkstra.cpp:82
Graph Algorithms.
Here is the call graph for this function:

◆ main()

int main ( void )

Main function.

Returns
0 on exit
199 {
200 tests(); // run self-test implementations
201 return 0;
202}
void tests()
Definition dijkstra.cpp:113
Here is the call graph for this function:

◆ minimum_distance()

int greedy_algorithms::dijkstra::minimum_distance ( std::vector< int > mdist,
std::vector< bool > vset,
int V )

Utility function that finds the vertex with the minimum distance in mdist.

Parameters
mdistarray of distances to each vertex
vsetarray indicating inclusion in the shortest path tree
Vthe number of vertices in the graph
Returns
index of the vertex with the minimum distance
82 {
83 int minVal = INT_MAX, minInd = 0;
84 for (int i = 0; i < V; i++) {
85 if (!vset[i] && (mdist[i] < minVal)) {
86 minVal = mdist[i];
87 minInd = i;
88 }
89 }
90
91 return minInd;
92}
Here is the call graph for this function:

◆ print()

void greedy_algorithms::dijkstra::print ( std::vector< int > dist,
int V )

Utility function to print the distances to vertices.

This function prints the distances to each vertex in a tabular format. If the distance is equal to INT_MAX, it is displayed as "INF".

Parameters
distAn array representing the distances to each vertex.
VThe number of vertices in the graph.
Returns
void
104 {
105 std::cout << "\nVertex Distance\n";
106 for (int i = 0; i < V; i++) {
107 if (dist[i] < INT_MAX) {
108 std::cout << i << "\t" << dist[i] << "\n";
109 }
110 else {
111 std::cout << i << "\tINF" << "\n";
112 }
113 }
114}

◆ tests()

static void tests ( )
static

Self-test implementations.

Returns
void
160 {
162
163 // 1st test.
164 graph.add_edge(6, 2, 4);
165 graph.add_edge(2, 6, 4);
166
167 assert(graph.edges[6][2] == 4);
168
169 // 2nd test.
170 graph.add_edge(0, 1, 1);
171 graph.add_edge(1, 0, 1);
172
173 assert(graph.edges[0][1] == 1);
174
175 // 3rd test.
176 graph.add_edge(0, 2, 7);
177 graph.add_edge(2, 0, 7);
178 graph.add_edge(1, 2, 1);
179 graph.add_edge(2, 1, 1);
180
181 assert(graph.edges[0][2] == 7);
182
183 // 4th test.
184 graph.add_edge(1, 3, 3);
185 graph.add_edge(3, 1, 3);
186 graph.add_edge(1, 4, 2);
187 graph.add_edge(4, 1, 2);
188 graph.add_edge(2, 3, 2);
189
190 assert(graph.edges[1][3] == 3);
191
192 std::cout << "All tests have successfully passed!\n";
193}
Wrapper class for storing a graph.
Definition dijkstra.cpp:35