111 lines
No EOL
2.8 KiB
Text
111 lines
No EOL
2.8 KiB
Text
struct Graph {
|
|
AdjList?[] adj_lists
|
|
}
|
|
|
|
struct AdjList {
|
|
Edge[] edges
|
|
}
|
|
|
|
struct Edge {
|
|
int neighbor;
|
|
int weight
|
|
}
|
|
|
|
global e01 = new Edge { neighbor = 1; weight = 4 };
|
|
global e07 = new Edge { neighbor = 7; weight = 8 };
|
|
|
|
global e12 = new Edge { neighbor = 2; weight = 8 };
|
|
global e17 = new Edge { neighbor = 7; weight = 11 };
|
|
|
|
global e23 = new Edge { neighbor = 3; weight = 7 };
|
|
global e25 = new Edge { neighbor = 5; weight = 4 };
|
|
global e28 = new Edge { neighbor = 8; weight = 2 };
|
|
|
|
global e34 = new Edge { neighbor = 4; weight = 9 };
|
|
|
|
global e53 = new Edge { neighbor = 3; weight = 14 };
|
|
global e54 = new Edge { neighbor = 4; weight = 10 };
|
|
|
|
global e65 = new Edge { neighbor = 5; weight = 2 };
|
|
global e68 = new Edge { neighbor = 8; weight = 6 };
|
|
|
|
global e76 = new Edge { neighbor = 6; weight = 1 };
|
|
global e78 = new Edge { neighbor = 8; weight = 7 };
|
|
|
|
void print_int_array(int[] arr) {
|
|
for (var i = 0; i < length(arr); i = i + 1;) {
|
|
print_int(arr[i]);
|
|
print_string(" ");
|
|
}
|
|
return;
|
|
}
|
|
|
|
bool is_queue_empty(bool[] queued) {
|
|
for (var i = 0; i < length(queued); i = i + 1;) {
|
|
if (queued[i]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
int get_min_dist_node(bool[] queued, int[] dist) {
|
|
var curr_min = -1;
|
|
var curr_min_node = 0;
|
|
for (var i = 0; i < length(queued); i = i + 1;) {
|
|
if (queued[i]) {
|
|
var curr_dist = dist[i];
|
|
if (curr_dist != -1 & (curr_dist < curr_min | curr_min == -1)) {
|
|
curr_min = curr_dist;
|
|
curr_min_node = i;
|
|
}
|
|
}
|
|
}
|
|
return curr_min_node;
|
|
}
|
|
|
|
int[] dijkstras(Graph graph, int source) {
|
|
var n = length(graph.adj_lists);
|
|
var dist = new int[n]{id -> -1};
|
|
var queued = new bool[n]{id -> true};
|
|
|
|
dist[source] = 0;
|
|
|
|
while (!is_queue_empty(queued)) {
|
|
var curr = get_min_dist_node(queued, dist);
|
|
queued[curr] = false;
|
|
|
|
if?(AdjList a = graph.adj_lists[curr]) {
|
|
var a_edges = a.edges;
|
|
for (var i = 0; i < length(a_edges); i = i + 1;) {
|
|
var curr_edge = a_edges[i];
|
|
var curr_neighbor = curr_edge.neighbor;
|
|
var alt_dist = dist[curr] + curr_edge.weight;
|
|
if (dist[curr_neighbor] == -1 | alt_dist < dist[curr_neighbor]) {
|
|
dist[curr_neighbor] = alt_dist;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return dist;
|
|
}
|
|
|
|
int program (int argc, string[] argv) {
|
|
var a0 = new AdjList { edges = new Edge[]{e01, e07} };
|
|
var a1 = new AdjList { edges = new Edge[]{e12, e17} };
|
|
var a2 = new AdjList { edges = new Edge[]{e23, e25, e28} };
|
|
var a3 = new AdjList { edges = new Edge[]{e34} };
|
|
var a4 = AdjList null;
|
|
var a5 = new AdjList { edges = new Edge[]{e53, e54} };
|
|
var a6 = new AdjList { edges = new Edge[]{e65, e68} };
|
|
var a7 = new AdjList { edges = new Edge[]{e76, e78} };
|
|
var a8 = AdjList null;
|
|
|
|
var graph = new Graph { adj_lists = new AdjList?[]{a0, a1, a2, a3, a4, a5, a6, a7, a8} };
|
|
|
|
var result = dijkstras(graph, 0);
|
|
print_int_array(result);
|
|
|
|
return 0;
|
|
} |