RosettaCodeData/Task/Dijkstras-algorithm/ALGOL-68/dijkstras-algorithm-2.alg

53 lines
1.5 KiB
Plaintext

#!/usr/bin/a68g --script #
# -*- coding: utf-8 -*- #
CO REQUIRED BY "prelude_dijkstras_algorithm.a68" CO
MODE ROUTELEN = INT,
ROUTELEN route len infinity = max int,
PROC route len add = (VERTEX v, ROUTE r)ROUTELEN:
route len OF v + route len OF r; # or MAX(v,r) #
MODE VERTEXPAYLOAD = STRING,
PROC dijkstra fix value error = (STRING msg)BOOL:
(put(stand error, (msg, new line)); FALSE);
#PROVIDES:#
# VERTEX*=~* #
# ROUTE*=~* #
# vertex route*=~* #
PR READ "prelude_dijkstras_algorithm.a68" PR;
FORMAT vertex data fmt = $g$;
main:(
INT upb graph = 6, upb route list = 9;
HEAP[upb graph]VALVERTEX graph;
# name the key vertices #
FOR this TO UPB graph DO graph[this] INIT STRING("abcdef"[this]) OD;
# declare some variables of the same name #
VERTEX a := graph[1], b := graph[2], c := graph[3],
d := graph[4], e := graph[5], f := graph[6];
# define the graph #
HEAP FLEX[upb route list]VALROUTE route list := (
(a, b, 7), (a, c, 9), (a, f, 14),
(b, c, 10), (b, d, 15),
(c, d, 11), (c, f, 2),
(d, e, 6),
(e, f, 9)
);
# FOR VERTEXROUTE vertex route IN # vertex route gen dijkstra(a, e, route list#) DO #,
## (VERTEXROUTE vertex route)VOID: (
CASE vertex route IN
(VERTEX vertex): printf((vertex data fmt, vertex data OF vertex)),
(ROUTE route): printf(($" --"g(0)"-> "$, route len OF route))
ESAC
# OD #));
print(new line)
# TODO: generate random 100000 VERTEX graph test case and test performance - important #
)