CS153/hw6/hw4programs/sp22_tests/bellmanford.oat
jmug ee01a8f5b2 Change hw6 to an unsolved version.
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
2025-01-24 23:10:01 -08:00

62 lines
1.9 KiB
Text

/* take infinity to be int max value, assume shortest path is shorter than this */
global infinity = 9223372036854775807;
/* takes number of vertices n (ints 0 to n -1), number of edges, edge list (u, v, w) of weighted directed graph, source vertex
computes length of shortest path from source vertex to every vertex, distances invalid if negative cycles exist
*/
int[] bellman_ford(int n, int m, int[][] edges, int source) {
var distance = new int[n];
for (var i = 0; i < n; i = i + 1;) {
distance[i] = infinity;
}
distance[source] = 0;
for (var i = 0; i < n - 1; i = i + 1;) {
for(var j = 0; j < m; j = j + 1;) {
var edge = edges[j];
var u = edge[0];
var v = edge[1];
var w = edge[2];
if (distance[u] + w < distance[v]) {
distance[v] = distance[u] + w;
}
}
}
/* check negative cycles */
for(var j = 0; j < m; j = j + 1;) {
var edge = edges[j];
var u = edge[0];
var v = edge[1];
var w = edge[2];
if (distance[u] + w < distance[v]) {
print_string("Negative cycle detected! Distances are invalid\n");
}
}
return distance;
}
int program(int argc, string[] argv) {
var n = 6;
var m = 9;
var edges = new int[][]{ new int[]{0, 1, 4},
new int[]{0, 2, -3},
new int[]{2, 1, -2},
new int[]{2, 3, 10},
new int[]{3, 1, 6},
new int[]{2, 4, 1},
new int[]{2, 5, -9},
new int[]{3, 5, -1},
new int[]{5, 4, 4} };
var source = 0;
var dest = 5;
var shortest_path = -12;
var distance = bellman_ford(n, m, edges, source);
if (distance[dest] == shortest_path) {
return 0;
}
return 1;
}