CS153/hw6/hw5programs/sp22_tests/floyd_warshall.oat

108 lines
3.3 KiB
Text
Raw Normal View History

struct Graph {
AdjList?[] adj_lists
}
struct AdjList {
Edge[] edges
}
struct Edge {
int neighbor;
int weight;
bool neg
}
global e01 = new Edge { neighbor = 1; weight = 5; neg = true };
global e02 = new Edge { neighbor = 2; weight = 10; neg = false };
global e04 = new Edge { neighbor = 4; weight = 0; neg = false };
global e07 = new Edge { neighbor = 7; weight = 51; neg = false};
global e12 = new Edge { neighbor = 2; weight = 12; neg = false };
global e23 = new Edge { neighbor = 3; weight = 3; neg = true };
global e34 = new Edge { neighbor = 4; weight = 5; neg = false };
global e36 = new Edge { neighbor = 6; weight = 50; neg = false };
global e40 = new Edge {neighbor = 0; weight = 1; neg = true };
global e45 = new Edge { neighbor = 5; weight = 100; neg = false };
global e78 = new Edge { neighbor = 8; weight = 10; neg = false };
global e710 = new Edge { neighbor = 10; weight = 5; neg = true};
global e89 = new Edge { neighbor = 9; weight = 3; neg = false };
global e97 = new Edge { neighbor = 7; weight = 12; neg = false };
global e910 = new Edge { neighbor = 10; weight = 2; neg = true };
global e100 = new Edge {neighbor = 0; weight = 79; neg = false };
void print_int_array(int[][] arr) {
for (var i = 0; i < length(arr); i = i + 1;) {
for (var j = 0; j < length(arr[i]); j = j + 1;) {
print_int(arr[i][j]);
print_string(" ");
}
}
return;
}
int[][] floyd_warshall(Graph graph) {
var n = length(graph.adj_lists);
var dist = new int[][n]{i -> new int[n]{j -> 999}};
for (var i = 0; i < n; i = i+1;) {
dist[i][i] = 0;
}
for (var i = 0; i < n; i = i + 1;) {
if?(AdjList v = graph.adj_lists[i]) {
var v_edges = v.edges;
for (var j = 0; j < length(v_edges); j = j + 1;) {
var nbr = v_edges[j].neighbor;
var weight = v_edges[j].weight;
var negative = v_edges[j].neg;
if (negative) {
weight = 0 - weight;
}
dist[i][nbr] = weight;
}
}
}
for (var k = 0; k < n; k = k + 1;) {
for (var i = 0; i < n; i = i + 1;) {
for (var j = 0; j < n; j = j + 1;) {
if (dist[i][k] < 999 & (dist[k][j] < 999)) {
if (dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
}
return dist;
}
int program (int argc, string[] argv) {
var a0 = new AdjList { edges = new Edge[]{e01, e02, e04, e07} };
var a1 = new AdjList { edges = new Edge[]{e12} };
var a2 = new AdjList { edges = new Edge[]{e23} };
var a3 = new AdjList { edges = new Edge[]{e34, e36} };
var a4 = new AdjList { edges = new Edge[]{e45, e40} };
var a5 = AdjList null;
var a6 = AdjList null;
var a7 = new AdjList { edges = new Edge[]{e78, e710} };
var a8 = new AdjList { edges = new Edge[]{e89} };
var a9 = new AdjList { edges = new Edge[]{e910, e97} };
var a10 = new AdjList {edges = new Edge[]{e100} };
var graph = new Graph { adj_lists = new AdjList?[]{a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10} };
var result = floyd_warshall(graph)[0];
for (var i = 0; i < 10; i = i + 1;) {
print_int(result[i]);
print_string(" ");
}
return 0;
}