is a graph search algorithm, often used in routing. For a given node in the graph, the algorithm finds the path with lowest cost between that node and every other node. It can also be used for finding costs of shortest paths from a single node to a single destination node by stopping the algorithm once the shortest path (lowest cost) to the destination node has been determined.

The algorithm is described on-line fairly good, so I won't spend time describing it again here. The main ideas are that we need to keep a list with all the nodes that we visited and another list with all the nodes that we still haven't visited. At each iteration we take the unvisited node with the lowest distance from the source (calculated so far) and calculate the distance from the source to each of it's neighbors. We stop when there are no unvisited nodes.

I'm just going to print the algorithm since it does all the talking by itself. Some comments are available in the code which should explain everything.

1: #include <iostream>

2: #include <vector>

3: #include <string>

4: #include <set>

5: #include <queue>

6: using namespace std;

7:

8: const int SIZE = 5; //number of nodes

9: int graph[SIZE][SIZE];//the graph itself

10: int d[SIZE]; //distances from the source to each node

11: int pi[SIZE];//contains the predecessor node for each node

12: vector<int> s;//list of nodes which were already visited

13: vector<int> vs;//list of nodes which were not visited yet

14:

15: void sort(vector<int>* vec) {

16: //sorts the vector of nodes according to

17: //distances from the source to each node

18: for (unsigned int i = 0; i < vec->size(); i++)

19: for (unsigned int j = i; j < vec->size(); j++)

20: if (d[vec->at(i)] > d[vec->at(j)]) {

21: int temp = vec->at(i);

22: vec->at(i) = vec->at(j);

23: vec->at(j) = temp;

24: }

25: }

26:

27: void relax(vector<int>* vec, int u) {

28: //updates the distances from the source to each node

29: //and the predecessor for each node

30: for (unsigned int i = 0; i < vec->size(); i++) {

31: int vi = vec->at(i);

32: if (graph[u][vi] == SHRT_MAX)

33: continue;

34: if (d[vi] > d[u] + graph[u][vi]) {

35: d[vi] = d[u] + graph[u][vi];

36: pi[vi] = u;

37: }

38: }

39: }

40:

41: void printShortestPathTo(int v) {

42: //this simply prints the vector of predecessors

43: //for the requested node (v)

44: cout << "Distance to " << v << " is " << d[v] << endl;

45: cout << "Shortest path: ";

46: int x = pi[v];

47: while (x != -1) {

48: cout << x << "<-";

49: x = pi[x];

50: }

51: cout << endl << endl;

52: }

53:

54: int main() {

55: //initialize all the costs in the graph

56: for (int i = 0; i < SIZE; i++)

57: for (int j = 0; j < SIZE; j++)

58: graph[i][j] = SHRT_MAX;

59:

60: graph[0][1] = 20;

61: graph[0][4] = 40;

62: graph[1][4] = 50;

63: graph[2][3] = 30;

64: graph[2][4] = 60;

65: graph[4][2] = 20;

66: graph[4][3] = 100;

67:

68: for (int i = 0; i < SIZE; i++) {

69: for (int j = 0; j < SIZE; j++) {

70: cout << graph[i][j] << "\t";

71: }

72: cout << endl;

73: }

74: for (int i = 0; i < SIZE; i++) {

75: vs.push_back(i);//initialize all the variables

76: d[i] = SHRT_MAX;//all distances to infinite

77: pi[i] = -1;//nodes have no predecesors

78: }

79: d[0] = 0; //the distance of the source is 0

80: sort(&vs); //we sort the nodes according to the distance

81:

82: while (vs.size() > 0) {

83: int x = vs.front();//take the node with the shortest distance

84: for (unsigned int i = 0; i < vs.size() - 1; i++) {

85: vs.at(i) = vs.at(i + 1);

86: }

87: vs.pop_back();

88: s.push_back(x);//mark it as visited

89: relax(&vs, x);//update the distances

90: sort(&vs); //sort the nodes according to the new distances

91: }

92:

93: printShortestPathTo(4);//choose any node

94: return 0;

95: }