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 и его временная сложность.


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

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

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

(c)

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

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

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) слишком прост, не так ли?

Ответы

Ответ 1

Вы на правильном пути, и решение очень просто.

В обоих B, C, уменьшите проблему до нормальной dijkstra, которая не принимает весов на вершинах.
Для этого вам нужно будет определить w':E->R новую функцию веса для ребер.

w'(u,v) = w(u,v) + vertex_weight(v)

в (b) w(u,v) = 0 (или const), и решение является надежным и для соответствия (c)!

Идея этого заключается в том, что вы используете стоимость края, которую вы вес груза, и стоимость достижения целевой вершины. Стоимость источника уже была оплачена, поэтому вы игнорируете ее 1.

Уменьшение проблемы вместо замены алгоритма обычно намного проще в использовании, доказывать и анализировать!


(1) В этом решении вы "пропустите" вес источника, поэтому кратчайший путь от s до t будет: dijkstra(s,t,w') + vertex_weight(s)_ [где dijkstra(s,t,w') - это расстояние от s до t используя w'

Ответ 2

Вес вершины можно удалить, разрезая каждую вершину a в две вершины a1 и a2 с ребром от a1 до a2 с весом a.

Я думаю, что вы правы для адаптации алгоритма dijkstras.