| // This script implements Dijkstra"s shortest | |
| // path algorighm | |
| var s : Node; | |
| s = Node.allInstances.select(n|n.label = "a").first(); | |
| for (n in Node.allInstances) { | |
| n.~distance = 10000; | |
| } | |
| s.~distance = 0; | |
| var Q : Sequence(Node); | |
| Q = Node.allInstances.clone(); | |
| while (not Q.isEmpty()) { | |
| var u : Node; | |
| u = Q.extractMin(); | |
| for (e in u.outgoing) { | |
| var v : Node; | |
| v = e.target; | |
| if (u.~distance + e.weight < v.~distance) { | |
| v.~distance = u.~distance + e.weight; | |
| v.~previous = u; | |
| } | |
| } | |
| } | |
| // Print distances and paths | |
| for (n in Node.allInstances){ | |
| ("Distance of " + n.label + " from " + s.label + " : " + | |
| n.~distance + " via " + n.getPath()).println(); | |
| } | |
| operation Sequence(Node) extractMin() : Node { | |
| var min : Node; | |
| min = self.select(n|self.forAll( | |
| n1|n.~distance <= n1.~distance)).first(); | |
| self.remove(min); | |
| return min; | |
| } | |
| operation Node getPath() : String { | |
| if (self.~previous.isDefined()) { | |
| return self.~previous.getPath() + "->" + self.label; | |
| } | |
| return self.label; | |
| } |