graph - Кратчайший путь с весом вершины

Вот акциз:

В некоторых задачах с графами вершины могут иметь веса вместо или в дополнение к весам ребер. Пусть Cv будет стоимостью вершины v, а C(x,y) — стоимость ребра (x, y). Эта проблема касается с нахождением самого дешевого пути между вершинами a и b в графе G. Стоимость пути равна сумме стоимостей ребер и вершин встречающиеся на пути.

(a) Предположим, что каждое ребро в графе имеет нулевой вес (в то время как неребра имеют стоимость ∞). Предположим, что Cv =1 для всех вершин 1≤v≤n (т. е. все вершины имеют одинаковую стоимость). Подскажите эффективный алгоритм найти самый дешевый путь из a в b и его временную сложность.

(b) Теперь предположим, что стоимость вершин не постоянна (но все положительна), а краевые затраты остаются прежними. Дайте эффективную алгоритм поиска самого дешевого пути из a в b и его времени сложность.

(c) Теперь предположим, что стоимость ребер и вершин непостоянны. (но все положительные). Предложите эффективный алгоритм нахождения самый дешевый путь от a до b и его временная сложность.


Вот мой ответ:

(а) использовать обычный BFS;

(b) Использовать алгоритм Дейкстры, но заменить вес на вес вершины;

(c)

Также используйте алгоритм Дейкстры

Если рассматривать только вес ребра, то для ключевой части алгоритма Дейкстры мы имеем:

if (distance[y] > distance[v]+weight) {
    distance[y] = distance[v]+weight; // weight is between v and y
}

Теперь, учитывая вес вершины, мы имеем:

if (distance[y] > distance[v] + weight + vertexWeight[y]) {
   distance[y] = distance[v] + weight + vertexWeight[y]; // weight is between v and y
}

Я прав?

Думаю, мой ответ на (c) слишком прост, не так ли?

19
задан lukess 16 October 2017 в 00:36
поделиться