В алгоритме Крускала мы сортируем и выбираем ребра в порядке неубывания их весов.
Допустим, мы используем структуру данных (что-то вроде кортежа) для хранения ребер как <source vertex,destination vertex, weight of edge between them>
. Сортируем и выбираем ребра в порядке неубывания их веса.
Теперь в случае более чем одного оптимального решения вы предпочитаете то, в котором меньше аэропортов. Поэтому добавьте еще одно поле (скажем, типа boolean
) в структуру данных для хранения, если в конечной вершине (городе) есть аэропорт. Это должно выглядеть примерно так: <source vertex,destination vertex, weight of edge between them, has_destination_an_airport>
. has_destination_an_airport
равен true
, если в конечной вершине (городе) есть аэропорт, иначе false
.
Теперь, когда мы сортируем ребра в порядке неубывания их весов, если веса одинаковы, то предпочитаем тот, у которого нет аэропорта, т.е. has_destination_an_airport
это false
, если возможно.
Подводя итог, можно сказать, что правильная реализация comparator
для сортировки ребер сотворит чудо.
Что касается асимптотической временной и пространственной сложности, то она такая же, как и у алгоритма Крускала. Единственным накладным расходом является дополнительное поле, чтобы помнить, есть ли в конечной вершине аэропорт, что тривиально.
person
Shridhar R Kulkarni
schedule
30.04.2017