Bellman-Ford

Hi, so I'm playing and currently learning about Bellman-Ford Algorithm and want to how can I make it possible to view which Vertexes the Source went by to reach the Destination.

This is my code.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <fstream>
#include <iostream>

using namespace std;
 
// a structure to represent a weighted edge in graph
struct Edge
{
        int src, dest, weight;
};
 
// a structure to represent a connected, directed and weighted graph
struct Graph
{
        // V-> Number of vertices, E-> Number of edges
        int V, E;
 
        // graph is represented as an array of edges.
        struct Edge* edge;
};
 
// Creates a graph with V vertices and E edges
struct Graph* createGraph(int V, int E)
{
    struct Graph* graph = (struct Graph*) malloc(sizeof(struct Graph));
    graph->V = V;
    graph->E = E;
 
    graph->edge = (struct Edge*) malloc(graph->E * sizeof(struct Edge));
 
    return graph;
}
 
// A utility function used to print the solution
void printArr(int dist[], int n)
{
    printf("Vertex\t\tDistance from Source\n");
    for (int i = 0; i < n; ++i)
        printf("%d \t\t %d\n", i, dist[i]);
}
 
// The main function that finds shortest distances from src to all other
// vertices using Bellman-Ford algorithm.  The function also detects negative
// weight cycle
void BellmanFord(struct Graph* graph, int src)
{
    int V = graph->V;
    int E = graph->E;
    int dist[V];
 
    // Step 1: Initialize distances from src to all other vertices as INFINITE
    for (int i = 0; i < V; i++)
        dist[i] = INT_MAX;
    dist[src] = 0;
 
    // Step 2: Relax all edges |V| - 1 times. A simple shortest path from src
    // to any other vertex can have at-most |V| - 1 edges
    for (int i = 1; i <= V - 1; i++) {
        for (int j = 0; j < E; j++) {
            int u = graph->edge[j].src;
            int v = graph->edge[j].dest;
            int weight = graph->edge[j].weight;
            if (dist[u] != INT_MAX && dist[u] + weight < dist[v]){
                dist[v] = dist[u] + weight;
                
            }
        }
    }
 
    // Step 3: check for negative-weight cycles.  The above step guarantees
    // shortest distances if graph doesn't contain negative weight cycle.
    // If we get a shorter path, then there is a cycle.
    for (int i = 0; i < E; i++)
    {
        int u = graph->edge[i].src;
        int v = graph->edge[i].dest;
        int weight = graph->edge[i].weight;
        if (dist[u] != INT_MAX && dist[u] + weight < dist[v])
            printf("Graph contains negative weight cycle");
    }
 
    printArr(dist, V);
 
    return;
}
 
// Driver program to test above functions
int main()
{
    /* Let us create the graph given in above example */
    int V; // Number of vertices in graph
    int E; // Number of edges in graph
    int S; // Select source node
    
    ifstream file;
	file.open("path");
	
	if(!file.is_open()){
		cout << "File Error";
		return -1;
	}
	
	file >> V >> E;
	cout << V << " " << E << endl;
    
    struct Graph* graph = createGraph(V, E);
    
    ifstream file2;
	file2.open("path");
	
	if(!file.is_open()){
		cout << "File Error";
		return -1;
	}
	
	for(int i=0; i<E; i++){
		file2 >> graph->edge[i].src;
		file2 >> graph->edge[i].dest;
		file2 >> graph->edge[i].weight;	
		cout << graph->edge[i].src << "\t";
		cout << graph->edge[i].dest << "\t";
		cout << graph->edge[i].weight << endl;
    }

	cout << "Select source of node: ";
	cin >> S;
	
	BellmanFord(graph, S);
 
    return 0;
}


So the output will be something like this:

Source : 0
Vertex      Distance
0            0
1            4
2            9
3            7


and I want it to be able to show like:

Source: 0
Vertex       Distance       Parent
0             0              0
1             4              0
2             9              1
3             7              1


The parent here means that for Source vertex 0 to Vertex 2 or 3, it pass by Vertex 1.

Any comment or advice will be appreciated :)

Thank you :)
Last edited on
Topic archived. No new replies allowed.