Нашли ошибку?

Раскраска карты районов

СложнаяДописатьГлава 8

#жадные алгоритмы#графы#NP-полные задачиid: ga-color-map

Районы города нужно раскрасить на карте так, чтобы соседние районы были разного цвета. Цвета — числа 0, 1, 2, …. Минимальное число цветов искать не будем: это NP-полная задача. Раскрашиваем жадно: районы идут по убыванию числа соседей, и каждому достаётся наименьший цвет, не занятый его соседями. Допишите color_map(neighbors). Пропуски помечены # TODO.

Пример

neighbors = {
    "Центр": {"Север", "Юг", "Запад"},
    "Север": {"Центр", "Запад"},
    "Юг": {"Центр"},
    "Запад": {"Центр", "Север"},
}
color_map(neighbors)   # например {"Центр": 0, "Север": 1, "Запад": 2, "Юг": 1}

Правила

Решение

def color_map(neighbors: dict[str, set[str]]) -> dict[str, int]:
    """Жадная раскраска: соседние районы получают разные цвета 0, 1, 2, …"""
    colors: dict[str, int] = {}
    order = sorted(neighbors, key=lambda r: len(neighbors[r]), reverse=True)
    for region in order:
        # TODO: соберите цвета, уже занятые соседями region
        taken: set[int] = set()
        color = 0
        # TODO: подберите наименьший цвет, которого нет в taken
        colors[region] = color
    return colors

Можно решать и в своём редакторе: «Скопировать с тестами» и запустите python3 color_map.py — тесты те же, результат покажет ✓ / ✗ и итог.