| // Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| /// An asymmetric weighted complete graph. | |
| /// | |
| /// The vertices are identified by numbers 0 through [vertexCount] - 1. | |
| /// Edges are pairs of vertices. | |
| class Graph { | |
| /// Number of vertices. | |
| final int vertexCount; | |
| /// Table of weights, a list of length `vertexCount`*`vertexCount`. | |
| final List<int> _table; | |
| /// Creates a new complete graph with [vertexCount] vertices. | |
| /// | |
| /// The initial weights on all edges are [initialWeight]. | |
| Graph(this.vertexCount, [int initialWeight = 0]) | |
| : _table = List<int>.filled(vertexCount * vertexCount, initialWeight); | |
| /// Update the weight on the edges from [fromVertex] to [toVertex]. | |
| void setWeight(int fromVertex, int toVertex, int newWeight) { | |
| _table[fromVertex * vertexCount + toVertex] = newWeight; | |
| } | |
| /// The weight of the edge from [fromVertex] to [toVertex]. | |
| int weight(int fromVertex, int toVertex) => | |
| _table[fromVertex * vertexCount + toVertex]; | |
| /// The cumulative weight of the (sub-)path from `path[from]` to `path[to]`. | |
| /// | |
| /// If [to] is less than [from], the sub-path is traversed in reverse. | |
| /// The values in `path` should be vertices in this graph. | |
| int pathWeight(List<int> path, int from, int to) { | |
| var weight = 0; | |
| var cursor = path[from]; | |
| var step = from <= to ? 1 : -1; | |
| for (var i = from; i != to;) { | |
| i += step; | |
| var next = path[i]; | |
| weight += this.weight(cursor, next); | |
| cursor = next; | |
| } | |
| return weight; | |
| } | |
| } |