Чтобы было проще, я хотел бы, чтобы вы кое-что подумали:
Почему вы вводите Set
в вашем addEdge
методе?Можете ли вы выполнить задачу добавления ребра без него?
Как рассчитать вес пути?Подумайте о том, чтобы просто перебирать узлы / вершины, заданные в аргументе getPathWeight
, и искать в своем adjacency
.
Я думаю, что это довольно просто, вам просто нужно знать как получить вес ребра, который находится между 2 заданными вершинами (Но сначала вам нужно проверить из вашего adjacency
, что этот ребро действительно существует, или список, заданный path
, неверен, можетв этом случае следует исключить).
Фактический код будет выглядеть примерно так, но я бы посоветовал вам сначала подумать самостоятельно и попробовать написать код, прежде чем читать дальше.:) (Я думаю, что если вы можете решить структуру данных для Графа - которая составляет Map<VertexType, Map<VertexType, Double>>
, и я чувствую, что она достаточно хороша, то вы можете легко заполнить метод getPathWeight
правильным кодом самостоятельно)
У вас может быть простой тип реализации addEdge
:
public void addEdge(VertexType v1, VertexType v2, double weight) {
adjacency.computeIfAbsent(v1, v -> new HashMap<>()).put(v2,weight);
}
Простая реализация getPathWeight
:
public double getPathWeight(List<VertexType> path) throws GraphPathException {
VertexType previousVertex = path.get(0);
double resultWeight = 0.0;
for (int i = 1; i < path.size(); i++) {
VertexType currentVertex = path.get(i);
Map<VertexType, Double> adjacencyForPreviousVertex = adjacency.get(previousVertex);
if (adjacencyForPreviousVertex == null) {
throw new GraphPathException("Vertex " + previousVertex + " don't exist in graph");
}
Double currentEdgeWeight = adjacencyForPreviousVertex.get(currentVertex);
if (currentEdgeWeight == null) {
throw new GraphPathException(currentVertex + "Vertex don't exist as an adjacent Vertex of " + previousVertex);
}
resultWeight += currentEdgeWeight;
previousVertex = currentVertex;
}
return resultWeight;
}