algos_and_structures/grokaem/greedy_algos/set_covering.py
2024-11-02 14:03:30 +03:00

42 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Штаты, которые необходимо покрыть
states_needed = set(["mt", "wa", "or", "id", "nv", "ut", "ca", "az"])
# Станции, на которых вещают имеющиеся радиостанции
stations = {}
stations["kone"] = set(["id", "nv", "ut"])
stations["ktwo"] = set(["wa", "id", "mt"])
stations["kthree"] = set(["or", "nv", "ca"])
stations["kfour"] = set(["nv", "ut"])
stations["kfive"] = set(["ca", "az"])
# Набор радиостанций, покрывающий все необходимые штаты
final_stations = set()
while states_needed:
best_station = None
# Штаты, обслуживаемые этой станцией, которые еще не входят в текущее покрытие
states_covered = set()
# Перебор всех радиостанций и поиск наилучшей из них
for station, states_for_station in stations.items():
# Пересечение множеств необходимых к покрытию станций с станциями для
# итерируемой радиостанции
covered = states_needed & states_for_station
# Если длина множества пересечения больше длины покрытия лучшей текущей станции
# Иными словами в пересечение входит больше покрываемых штатов, чем для текущей
# лучшей станции
if len(covered) > len(states_covered):
# Назначаем эту станцию лучшей
best_station = station
# Переопределяем штаты, покрываемые лучшей на данный момент станцией
states_covered = covered
# После прохождения цикла лучшая станция добавляется в список станций для покрытия
final_stations.add(best_station)
# Необходимо вычесть из нужных для покрытия станций те, которые входят в найденную
# станцию
states_needed -= states_covered
print(final_stations)