/*
* Bellman-Ford Algorithm
*
* Authored by,
* Vamsi Sangam
*/
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int GLOBAL = 0;
// This is used to construct
// the Adjacency List
struct node {
int vertex, weight;
struct node * next;
};
// This is used to construct the Shortest Paths to all
// vertices, as we cannot return multiple values,
// we use a struct
struct pathInfo {
int vertex, distance, parent;
};
// Adds a new edge into the Adjacency List
// Follows Head Insertion for O(1) Insertion
struct node * add(struct node * head, int vertex, int weight)
{
struct node
* p
= (struct node
*) malloc(sizeof(struct node
));
p->vertex = vertex;
p->weight = weight;
p->next = head;
return p;
}
void PrintNegativeCycle(struct pathInfo shortestDistances[], int vertex, int startVertex)
{
if (vertex == startVertex) {
return;
} else {
PrintNegativeCycle(shortestDistances, shortestDistances[vertex].parent, startVertex);
}
}
// Bellman-Ford Algorithm which takes the Graph (adjacencyList[]), starting vertex (startVertex),
// and an empty array shortestDistances[] as input. It applies the algorithm and keeps filling values
// into shortestDistances[]. It returns true if there are no negative edges, and vice-versa.
int bellmanFord(struct node * adjacencyList[], int vertices, int startVertex, struct pathInfo shortestDistances[])
{
struct node * traverse;
int i, j, k;
// Initialisation
for (i = 0; i <= vertices; ++i) {
shortestDistances[i].vertex = i;
shortestDistances[i].distance = INT_MAX;
shortestDistances[i].parent = -1;
}
// Setting distance to source = 0
shortestDistances[startVertex].parent = 0;
shortestDistances[startVertex].distance = 0;
// The Algorithm that computes Shortest Distances
for (i = 1; i <= vertices - 1; ++i) { // Runs 'vertices - 1' times = O(|V|)
for (j = 1; j <= vertices; ++j) { // Runs as many times as the edges = O(|E|)
// The code ahead basically explores the whole of Adjcency List,
// covering one edge once, so the runtime of the code in this
// block is O(|E|)
traverse = adjacencyList[j];
while (traverse != NULL) {
if (shortestDistances[j].distance == INT_MAX) {
// Important...!
traverse = traverse->next;
continue;
}
// Checking for Relaxation
if (traverse->weight + shortestDistances[j].distance < shortestDistances[traverse->vertex].distance) {
// Relaxation
shortestDistances[traverse->vertex].distance = traverse->weight + shortestDistances[j].distance;
shortestDistances[traverse->vertex].parent = j;
}
traverse = traverse->next;
}
}
}
// Checking for Negative Cycles
for (j = 1; j <= vertices; ++j) {
traverse = adjacencyList[j];
while (traverse != NULL) {
// Checking for further relaxation
if (traverse->weight + shortestDistances[j].distance < shortestDistances[traverse->vertex].distance) {
GLOBAL = j;
// Negative Cycle found as further realxation is possible
return 0;
}
traverse = traverse->next;
}
}
return 1;
}
int main()
{
int vertices, edges,source, i, j, v1, v2, weight;
printf("Enter the Number of Vertices -\n");
printf("Enter the Number of Edges -\n");
printf("Enter the source Vertex -\n"); struct node * adjacency_list[vertices + 1];
//Size is made (vertices + 1) to use the
//array as 1-indexed, for simplicity
//Must initialize your array
for (i = 0; i <= vertices; ++i) {
adjacency_list[i] = NULL;
}
printf("Enter the edges -\n");
for (i = 1; i <= edges; ++i) {
scanf("%d%d%d", &v1
, &v2
, &weight
); adjacency_list[v1] = add(adjacency_list[v1], v2, weight);
}
//Printing Adjacency List
printf("\nAdjacency List -\n\n"); for (i = 1; i <= vertices; ++i) {
printf("adjacency_list[%d] -> ", i
);
struct node * temp = adjacency_list[i];
while (temp != NULL) {
printf("(%d, %d) -> ", temp
->vertex
, temp
->weight
); temp = temp->next;
}
}
struct pathInfo shortestDistances[vertices + 1];
int startVertex;
startVertex = source;
int check = bellmanFord(adjacency_list, vertices, startVertex, shortestDistances);
if (check == 1) {
printf("No Negative Cycles exist in the Graph -\n"); } else {
printf("Negative Cycles exists in the Graph -\n");
printf("GLOBAL VARIABLE: %d\n",GLOBAL
); printf("Vertices in negatice Cycle: "); PrintNegativeCycle(shortestDistances, shortestDistances[GLOBAL].parent, GLOBAL);
return 0;
}
printf("\n\nVertex Shortest Distance to Vertex %d Parent Vertex-\n", startVertex
); for (i = 1; i <= vertices; ++i) {
printf("%d %d %d\n", i
, shortestDistances
[i
].
distance, shortestDistances
[i
].
parent); }
return 0;
}
LyoKICogQmVsbG1hbi1Gb3JkIEFsZ29yaXRobQogKgogKiBBdXRob3JlZCBieSwKICogVmFtc2kgU2FuZ2FtCiAqLwogCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KIAppbnQgR0xPQkFMID0gMDsKLy8gVGhpcyBpcyB1c2VkIHRvIGNvbnN0cnVjdAovLyB0aGUgQWRqYWNlbmN5IExpc3QKc3RydWN0IG5vZGUgewogICAgaW50IHZlcnRleCwgd2VpZ2h0OwogICAgc3RydWN0IG5vZGUgKiBuZXh0Owp9OwogCi8vIFRoaXMgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIFNob3J0ZXN0IFBhdGhzIHRvIGFsbAovLyB2ZXJ0aWNlcywgYXMgd2UgY2Fubm90IHJldHVybiBtdWx0aXBsZSB2YWx1ZXMsCi8vIHdlIHVzZSBhIHN0cnVjdApzdHJ1Y3QgcGF0aEluZm8gewogICAgaW50IHZlcnRleCwgZGlzdGFuY2UsIHBhcmVudDsKfTsKIAovLyBBZGRzIGEgbmV3IGVkZ2UgaW50byB0aGUgQWRqYWNlbmN5IExpc3QKLy8gRm9sbG93cyBIZWFkIEluc2VydGlvbiBmb3IgTygxKSBJbnNlcnRpb24Kc3RydWN0IG5vZGUgKiBhZGQoc3RydWN0IG5vZGUgKiBoZWFkLCBpbnQgdmVydGV4LCBpbnQgd2VpZ2h0KQp7CiAgICBzdHJ1Y3Qgbm9kZSAqIHAgPSAoc3RydWN0IG5vZGUgKikgbWFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZSkpOwogCiAgICBwLT52ZXJ0ZXggPSB2ZXJ0ZXg7CiAgICBwLT53ZWlnaHQgPSB3ZWlnaHQ7CiAgICBwLT5uZXh0ID0gaGVhZDsKIAogICAgcmV0dXJuIHA7Cn0KCgp2b2lkIFByaW50TmVnYXRpdmVDeWNsZShzdHJ1Y3QgcGF0aEluZm8gc2hvcnRlc3REaXN0YW5jZXNbXSwgaW50IHZlcnRleCwgaW50IHN0YXJ0VmVydGV4KQp7CglpZiAodmVydGV4ID09IHN0YXJ0VmVydGV4KSB7CgkJcHJpbnRmKCIlZCAiLCB2ZXJ0ZXgpOwoJCXJldHVybjsKCX0gZWxzZSB7CgkJUHJpbnROZWdhdGl2ZUN5Y2xlKHNob3J0ZXN0RGlzdGFuY2VzLCBzaG9ydGVzdERpc3RhbmNlc1t2ZXJ0ZXhdLnBhcmVudCwgc3RhcnRWZXJ0ZXgpOwoJCXByaW50ZigiJWQgIiwgdmVydGV4KTsKCX0KfQoKIAovLyBCZWxsbWFuLUZvcmQgQWxnb3JpdGhtIHdoaWNoIHRha2VzIHRoZSBHcmFwaCAoYWRqYWNlbmN5TGlzdFtdKSwgc3RhcnRpbmcgdmVydGV4IChzdGFydFZlcnRleCksCi8vIGFuZCBhbiBlbXB0eSBhcnJheSBzaG9ydGVzdERpc3RhbmNlc1tdIGFzIGlucHV0LiBJdCBhcHBsaWVzIHRoZSBhbGdvcml0aG0gYW5kIGtlZXBzIGZpbGxpbmcgdmFsdWVzCi8vIGludG8gc2hvcnRlc3REaXN0YW5jZXNbXS4gSXQgcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBubyBuZWdhdGl2ZSBlZGdlcywgYW5kIHZpY2UtdmVyc2EuCmludCBiZWxsbWFuRm9yZChzdHJ1Y3Qgbm9kZSAqIGFkamFjZW5jeUxpc3RbXSwgaW50IHZlcnRpY2VzLCBpbnQgc3RhcnRWZXJ0ZXgsIHN0cnVjdCBwYXRoSW5mbyBzaG9ydGVzdERpc3RhbmNlc1tdKQp7CiAgICBzdHJ1Y3Qgbm9kZSAqIHRyYXZlcnNlOwogICAgaW50IGksIGosIGs7CiAKICAgIC8vIEluaXRpYWxpc2F0aW9uCiAgICBmb3IgKGkgPSAwOyBpIDw9IHZlcnRpY2VzOyArK2kpIHsKICAgICAgICBzaG9ydGVzdERpc3RhbmNlc1tpXS52ZXJ0ZXggPSBpOwogICAgICAgIHNob3J0ZXN0RGlzdGFuY2VzW2ldLmRpc3RhbmNlID0gSU5UX01BWDsKICAgICAgICBzaG9ydGVzdERpc3RhbmNlc1tpXS5wYXJlbnQgPSAtMTsKICAgIH0KIAogICAgLy8gU2V0dGluZyBkaXN0YW5jZSB0byBzb3VyY2UgPSAwCiAgICBzaG9ydGVzdERpc3RhbmNlc1tzdGFydFZlcnRleF0ucGFyZW50ID0gMDsKICAgIHNob3J0ZXN0RGlzdGFuY2VzW3N0YXJ0VmVydGV4XS5kaXN0YW5jZSA9IDA7CiAKICAgIC8vIFRoZSBBbGdvcml0aG0gdGhhdCBjb21wdXRlcyBTaG9ydGVzdCBEaXN0YW5jZXMKICAgIGZvciAoaSA9IDE7IGkgPD0gdmVydGljZXMgLSAxOyArK2kpIHsgICAgICAgIC8vIFJ1bnMgJ3ZlcnRpY2VzIC0gMScgdGltZXMgPSBPKHxWfCkKICAgICAgICBmb3IgKGogPSAxOyBqIDw9IHZlcnRpY2VzOyArK2opIHsgICAgICAgIC8vIFJ1bnMgYXMgbWFueSB0aW1lcyBhcyB0aGUgZWRnZXMgPSBPKHxFfCkKICAgICAgICAgICAgLy8gVGhlIGNvZGUgYWhlYWQgYmFzaWNhbGx5IGV4cGxvcmVzIHRoZSB3aG9sZSBvZiBBZGpjZW5jeSBMaXN0LAogICAgICAgICAgICAvLyBjb3ZlcmluZyBvbmUgZWRnZSBvbmNlLCBzbyB0aGUgcnVudGltZSBvZiB0aGUgY29kZSBpbiB0aGlzCiAgICAgICAgICAgIC8vIGJsb2NrIGlzIE8ofEV8KQogCiAgICAgICAgICAgIHRyYXZlcnNlID0gYWRqYWNlbmN5TGlzdFtqXTsKIAogICAgICAgICAgICB3aGlsZSAodHJhdmVyc2UgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgaWYgKHNob3J0ZXN0RGlzdGFuY2VzW2pdLmRpc3RhbmNlID09IElOVF9NQVgpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJbXBvcnRhbnQuLi4hCiAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2UgPSB0cmF2ZXJzZS0+bmV4dDsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgLy8gQ2hlY2tpbmcgZm9yIFJlbGF4YXRpb24KICAgICAgICAgICAgICAgIGlmICh0cmF2ZXJzZS0+d2VpZ2h0ICsgc2hvcnRlc3REaXN0YW5jZXNbal0uZGlzdGFuY2UgPCBzaG9ydGVzdERpc3RhbmNlc1t0cmF2ZXJzZS0+dmVydGV4XS5kaXN0YW5jZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFJlbGF4YXRpb24KICAgICAgICAgICAgICAgICAgICBzaG9ydGVzdERpc3RhbmNlc1t0cmF2ZXJzZS0+dmVydGV4XS5kaXN0YW5jZSA9IHRyYXZlcnNlLT53ZWlnaHQgKyBzaG9ydGVzdERpc3RhbmNlc1tqXS5kaXN0YW5jZTsKICAgICAgICAgICAgICAgICAgICBzaG9ydGVzdERpc3RhbmNlc1t0cmF2ZXJzZS0+dmVydGV4XS5wYXJlbnQgPSBqOwogICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICB0cmF2ZXJzZSA9IHRyYXZlcnNlLT5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogCiAgICAvLyBDaGVja2luZyBmb3IgTmVnYXRpdmUgQ3ljbGVzCiAgICBmb3IgKGogPSAxOyBqIDw9IHZlcnRpY2VzOyArK2opIHsKICAgICAgICB0cmF2ZXJzZSA9IGFkamFjZW5jeUxpc3Rbal07CiAKICAgICAgICB3aGlsZSAodHJhdmVyc2UgIT0gTlVMTCkgewogICAgICAgICAgICAvLyBDaGVja2luZyBmb3IgZnVydGhlciByZWxheGF0aW9uCiAgICAgICAgICAgIGlmICh0cmF2ZXJzZS0+d2VpZ2h0ICsgc2hvcnRlc3REaXN0YW5jZXNbal0uZGlzdGFuY2UgPCBzaG9ydGVzdERpc3RhbmNlc1t0cmF2ZXJzZS0+dmVydGV4XS5kaXN0YW5jZSkgewoJCQkJR0xPQkFMID0gajsKICAgICAgICAgICAgICAgIC8vIE5lZ2F0aXZlIEN5Y2xlIGZvdW5kIGFzIGZ1cnRoZXIgcmVhbHhhdGlvbiBpcyBwb3NzaWJsZQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KIAogICAgICAgICAgICB0cmF2ZXJzZSA9IHRyYXZlcnNlLT5uZXh0OwogICAgICAgIH0KICAgIH0KIAogICAgcmV0dXJuIDE7Cn0KIAppbnQgbWFpbigpCnsKICAgICAgICBpbnQgdmVydGljZXMsIGVkZ2VzLHNvdXJjZSwgaSwgaiwgdjEsIHYyLCB3ZWlnaHQ7CiAKICAgIHByaW50ZigiRW50ZXIgdGhlIE51bWJlciBvZiBWZXJ0aWNlcyAtXG4iKTsKICAgIHNjYW5mKCIlZCIsICZ2ZXJ0aWNlcyk7CiAKICAgIHByaW50ZigiRW50ZXIgdGhlIE51bWJlciBvZiBFZGdlcyAtXG4iKTsKICAgIHNjYW5mKCIlZCIsICZlZGdlcyk7CiAgICAKCXByaW50ZigiRW50ZXIgdGhlIHNvdXJjZSBWZXJ0ZXggLVxuIik7CiAgICBzY2FuZigiJWQiLCAmc291cmNlKTsKICAgIHN0cnVjdCBub2RlICogYWRqYWNlbmN5X2xpc3RbdmVydGljZXMgKyAxXTsKICAgIC8vU2l6ZSBpcyBtYWRlICh2ZXJ0aWNlcyArIDEpIHRvIHVzZSB0aGUKICAgIC8vYXJyYXkgYXMgMS1pbmRleGVkLCBmb3Igc2ltcGxpY2l0eQogCiAgICAvL011c3QgaW5pdGlhbGl6ZSB5b3VyIGFycmF5CiAgICBmb3IgKGkgPSAwOyBpIDw9IHZlcnRpY2VzOyArK2kpIHsKICAgICAgICBhZGphY2VuY3lfbGlzdFtpXSA9IE5VTEw7CiAgICB9CiAgICBwcmludGYoIkVudGVyIHRoZSBlZGdlcyAtXG4iKTsKIAogICAgZm9yIChpID0gMTsgaSA8PSBlZGdlczsgKytpKSB7CiAgICAgICAgc2NhbmYoIiVkJWQlZCIsICZ2MSwgJnYyLCAmd2VpZ2h0KTsKICAgICAgICBhZGphY2VuY3lfbGlzdFt2MV0gPSBhZGQoYWRqYWNlbmN5X2xpc3RbdjFdLCB2Miwgd2VpZ2h0KTsKICAgIH0KICAgIC8vUHJpbnRpbmcgQWRqYWNlbmN5IExpc3QKICAgIHByaW50ZigiXG5BZGphY2VuY3kgTGlzdCAtXG5cbiIpOwogICAgZm9yIChpID0gMTsgaSA8PSB2ZXJ0aWNlczsgKytpKSB7CiAgICAgICAgcHJpbnRmKCJhZGphY2VuY3lfbGlzdFslZF0gLT4gIiwgaSk7CiAKICAgICAgICBzdHJ1Y3Qgbm9kZSAqIHRlbXAgPSBhZGphY2VuY3lfbGlzdFtpXTsKIAogICAgICAgIHdoaWxlICh0ZW1wICE9IE5VTEwpIHsKICAgICAgICAgICAgcHJpbnRmKCIoJWQsICVkKSAtPiAiLCB0ZW1wLT52ZXJ0ZXgsIHRlbXAtPndlaWdodCk7CiAgICAgICAgICAgIHRlbXAgPSB0ZW1wLT5uZXh0OwogICAgICAgIH0KIAogICAgICAgIHByaW50ZigiTlVMTFxuIik7CiAgICB9CiAKICAgIHN0cnVjdCBwYXRoSW5mbyBzaG9ydGVzdERpc3RhbmNlc1t2ZXJ0aWNlcyArIDFdOwogICAgaW50IHN0YXJ0VmVydGV4OwogCXN0YXJ0VmVydGV4ID0gc291cmNlOwogCWludCBjaGVjayA9IGJlbGxtYW5Gb3JkKGFkamFjZW5jeV9saXN0LCB2ZXJ0aWNlcywgc3RhcnRWZXJ0ZXgsIHNob3J0ZXN0RGlzdGFuY2VzKTsKICAgIGlmIChjaGVjayA9PSAxKSB7CiAgICAgICAgcHJpbnRmKCJObyBOZWdhdGl2ZSBDeWNsZXMgZXhpc3QgaW4gdGhlIEdyYXBoIC1cbiIpOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludGYoIk5lZ2F0aXZlIEN5Y2xlcyBleGlzdHMgaW4gdGhlIEdyYXBoIC1cbiIpOwoKCQlwcmludGYoIkdMT0JBTCBWQVJJQUJMRTogJWRcbiIsR0xPQkFMKTsKCQlwcmludGYoIlZlcnRpY2VzIGluIG5lZ2F0aWNlIEN5Y2xlOiAiKTsKCQlQcmludE5lZ2F0aXZlQ3ljbGUoc2hvcnRlc3REaXN0YW5jZXMsIHNob3J0ZXN0RGlzdGFuY2VzW0dMT0JBTF0ucGFyZW50LCBHTE9CQUwpOwoKCQlwcmludGYoIlxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAKICAgIHByaW50ZigiXG5cblZlcnRleCAgICBTaG9ydGVzdCBEaXN0YW5jZSB0byBWZXJ0ZXggJWQgICAgIFBhcmVudCBWZXJ0ZXgtXG4iLCBzdGFydFZlcnRleCk7CiAgICBmb3IgKGkgPSAxOyBpIDw9IHZlcnRpY2VzOyArK2kpIHsKICAgICAgICBwcmludGYoIiVkICAgICAgICAgJWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlZFxuIiwgaSwgc2hvcnRlc3REaXN0YW5jZXNbaV0uZGlzdGFuY2UsIHNob3J0ZXN0RGlzdGFuY2VzW2ldLnBhcmVudCk7CiAgICB9CiAKICAgIHJldHVybiAwOwp9