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.