Если я правильно понял, вы хотите найти кратчайший путь во взвешенном графе с дополнительной сложностью, состоящей в том, что вес пути является суммой веса нечетных ребер (1, 3, ...) или четные ребра (2, 4, ...) вдоль пути.
Вы можете сделать это, сначала создав новый граф:
- для каждой вершины
v
в исходном графе, создайте две вершины в новом графе, одна будет называться even v
, а другая odd v
- , если
(u, v)
является ребром веса w
в исходномдобавьте следующие грани к новому графику: (even u, odd v)
с весом w
и (odd u, even v)
с весом 0
Затем выполните два обычных Дейкстры, чтобы найти кратчайший путь, достигающий odd destination
и even destination
от even source
.Наименьший вес - самый короткий путь, если Клара едет первой.
Выполните ту же процедуру, начиная с odd source
, чтобы найти кратчайший путь, если Клара едет второй.
Доказательство
Инвариант, который мы хотим иметь в новом графе:
even v
- вершина, достигнутая через путь, последний край которого даже пронумерован odd v
- вершина, достигнутая по пути, последний край которого имеет нечетный номер
Поскольку мы только добавляем ребра от even
до odd
и от odd
доeven
этот инвариант верен для всего нового графа.Мы используем вес 0
для четных ребер, чтобы приспособить специальную весовую функцию для путей.
source
в исходном графе соответствует even source
в новом графе, если он достигнутпуть, содержащий 0
ребра, если Клара едет первым.Когда Клара едет второй, source
отображается на odd source
.
destination
в исходном графике может отображаться либо на even destination
, либо на odd destination
в зависимости от количества ребер на пути.Выбрав кратчайший взвешенный путь к любому из них, мы обязательно найдем кратчайший путь, используя специальную весовую функцию в исходном графике.