Чесно кажучи, я не можу повірити, що цього ще не просили, але ось це
Фон
Враховуючи простий непрямий плоский (графік можна намалювати в площині без перетинів), це доведена теорема про те, що граф є 4-кольоровим, термін, який ми вивчимо трохи. Однак зробити 5-кольоровий графік набагато простіше, саме на цьому ми сьогодні сфокусуємо своє завдання.
Дійсне k-забарвлення графа - це призначення «кольорів» вузлам графіка з такими властивостями
- Якщо два вузли з'єднані краєм, вузли пофарбовані різними кольорами.
- Поперек графіка є максимум 5 кольорів.
Враховуючи це, я представлю вам досить базовий алгоритм, щоб 5-кольоровий будь-який простий непрямий плоский графік. Цей алгоритм вимагає наступних визначень
Доступність : Якщо вузол 1 досягається від вузла 2, це означає, що існує послідовність вузлів, кожен з яких з'єднаний наступним ребром, таким чином, що перший вузол є вузлом 2, а останній - вузлом 1. Зауважте, що, оскільки графіки не спрямовані є симетричними, якщо вузол 1 досягається з вузла 2, вузол 2 доступний від вузла 1.
Підграф : Підграф графіка заданого набору вузлів N - це графік, де всі вузли підграфа знаходяться в N, а край вихідного графіка знаходиться в підграфові, якщо і тільки якщо обидва вузли з'єднані ребром знаходяться в Н.
Нехай Color (N) є функцією для кольорових плоских графіків з N вузлами з 5 кольорами. Визначимо функцію нижче
- Знайдіть вузол з найменшою кількістю вузлів, підключених до нього. Цей вузол матиме не більше 5 вузлів, підключених до нього.
- Видаліть цей вузол із графіка.
- Зателефонуйте Color (N-1) на цьому новому графіку, щоб його забарвити.
- Додайте видалений вузол назад у графік.
- Якщо можливо, пофарбуйте доданий вузол у колір, який не має жодного з його підключених вузлів.
- Якщо це неможливо, то всі 5 сусідніх вузлів до доданого вузла мають 5 різних кольорів, тому ми повинні спробувати наступний процес.
- Пронумеруйте вузли, що оточують доданий вузол n1 ... n5
- Розглянемо підграф всіх вузлів оригінального графіка, забарвлених тим же кольором, що і n1 або n3.
- Якщо в цьому підграфі n3 недоступно від n1, у наборі вузлів, доступних від n1 (включаючи n1), замініть всі входи кольору n1 на n3 та навпаки. Тепер пофарбуйте початковий колір доданого вузла n1.
- Якщо n3 був доступний з n1 в цьому новому графіку, виконайте процес з кроку 9 на вузлах n2 і n4, а не n1 і n3.
Виклик
З огляду на введення редактора (представляє графік), пофарбуйте графік, призначивши кожному вузлу значення.
Введення : список ребер у графіку (тобто [('a','b'),('b','c')...]
)
Зауважте, що вхідний редактор буде таким, що якщо (a, b) знаходиться у списку, (b, a) НЕ в списку.
Вихід : Об'єкт, що містить пари значень, де перший елемент кожної пари - це вузол, а другий - його колір, тобто [('a',1),('b',2)...]
або{'a':1,'b':2,...}
Ви можете використовувати що завгодно, щоб зобразити кольори, від цифр, до символів, до всього іншого.
Вхід і вихід є досить гнучкими, якщо цілком зрозуміло, що таке входи та виходи.
Правила
- Це проблема з кодовим гольфом
- Не потрібно використовувати алгоритм, який я описав вище. Він просто є для довідки.
- Для будь-якого графіка часто існує безліч дійсних методів їх фарбування. До тих пір, поки забарвлення, створений вашим алгоритмом, дійсна, це прийнятно.
- Пам'ятайте, що графік повинен бути 5-кольоровим.
Випробування
Використовуйте наступний код, щоб перевірити дійсність результатів фарбування. Оскільки існує багато дійсних забарвлень графіка на графіку, цей алгоритм просто перевіряє дійсність забарвлення. Див. Docstring, щоб побачити, як використовувати код.
Деякі випадкові (і досить нерозумні) тестові випадки :
Тестовий випадок 2: Графіт зміїв Krackhardt
[(0, 1), (0, 2), (0, 3), (0, 5), (1, 3), (1, 4), (1, 6), (2, 3), (2, 5), (3, 4), (3, 5), (3, 6), (4, 6), (5, 6), (5, 7), (6, 7), (7, 8), (8, 9)]
Дійсний вихід:
{0: 4, 1: 3, 2: 3, 3: 2, 4: 4, 5: 1, 6: 0, 7: 4, 8: 3, 9: 4}
Примітка . Ці тестові випадки занадто малі, щоб перевірити більш нюансовану поведінку алгоритму фарбування, тому побудова власних графіків, ймовірно, є хорошим тестом на обгрунтованість вашої роботи.
Примітка 2 : Я скоро додаю ще один фрагмент коду, який незабаром графіть ваше фарбувальне рішення.
Примітка 3 : Я не забув представлені випадкові алгоритми забарвлення, які були представлені. Це так круто в PPCG! Однак, якби хто-небудь міг би розіграти більш детермінований алгоритм, це теж було б круто.
5
їх 4
і повторно подати.