// 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 _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.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 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; } }