Графік 5-Розмальовки


14

Чесно кажучи, я не можу повірити, що цього ще не просили, але ось це

Фон

Враховуючи простий непрямий плоский (графік можна намалювати в площині без перетинів), це доведена теорема про те, що граф є 4-кольоровим, термін, який ми вивчимо трохи. Однак зробити 5-кольоровий графік набагато простіше, саме на цьому ми сьогодні сфокусуємо своє завдання.

Дійсне k-забарвлення графа - це призначення «кольорів» вузлам графіка з такими властивостями

  1. Якщо два вузли з'єднані краєм, вузли пофарбовані різними кольорами.
  2. Поперек графіка є максимум 5 кольорів.

Враховуючи це, я представлю вам досить базовий алгоритм, щоб 5-кольоровий будь-який простий непрямий плоский графік. Цей алгоритм вимагає наступних визначень

Доступність : Якщо вузол 1 досягається від вузла 2, це означає, що існує послідовність вузлів, кожен з яких з'єднаний наступним ребром, таким чином, що перший вузол є вузлом 2, а останній - вузлом 1. Зауважте, що, оскільки графіки не спрямовані є симетричними, якщо вузол 1 досягається з вузла 2, вузол 2 доступний від вузла 1.

Підграф : Підграф графіка заданого набору вузлів N - це графік, де всі вузли підграфа знаходяться в N, а край вихідного графіка знаходиться в підграфові, якщо і тільки якщо обидва вузли з'єднані ребром знаходяться в Н.

Нехай Color (N) є функцією для кольорових плоских графіків з N вузлами з 5 кольорами. Визначимо функцію нижче

  1. Знайдіть вузол з найменшою кількістю вузлів, підключених до нього. Цей вузол матиме не більше 5 вузлів, підключених до нього.
  2. Видаліть цей вузол із графіка.
  3. Зателефонуйте Color (N-1) на цьому новому графіку, щоб його забарвити.
  4. Додайте видалений вузол назад у графік.
  5. Якщо можливо, пофарбуйте доданий вузол у колір, який не має жодного з його підключених вузлів.
  6. Якщо це неможливо, то всі 5 сусідніх вузлів до доданого вузла мають 5 різних кольорів, тому ми повинні спробувати наступний процес.
  7. Пронумеруйте вузли, що оточують доданий вузол n1 ... n5
  8. Розглянемо підграф всіх вузлів оригінального графіка, забарвлених тим же кольором, що і n1 або n3.
  9. Якщо в цьому підграфі n3 недоступно від n1, у наборі вузлів, доступних від n1 (включаючи n1), замініть всі входи кольору n1 на n3 та навпаки. Тепер пофарбуйте початковий колір доданого вузла n1.
  10. Якщо 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! Однак, якби хто-небудь міг би розіграти більш детермінований алгоритм, це теж було б круто.


3
Чи не графік Петерсена та Чватала непланарний?
Кроппеб

1
@ NicHartley Є добре відомі операції на основі транспозиції на матрицях суміжності, які ефективно використовують кольорові графіки. Я прикладу папір, коли знайду його.
Дон Тисяча

1
Я думаю, вам було б краще обмежувати рішення поліноміальним часом або вимагати успішного запуску великого тестового випадку, щоб змусити рішення використовувати алгоритми графіків, як те, що, здається, ви маєте на увазі.
xnor

2
@xnor Я, здається, навчився свого уроку. Це нормально! Мислення поза коробкою слід винагороджувати, а не штрафувати.
Дон Тисяча

1
Так, я знаю, але питання в 4 кольорових кольорах потрібно було б створити таким чином, щоб люди не могли просто отримати відповіді на це запитання, змінити 5їх 4і повторно подати.
Пітер Тейлор

Відповіді:


6

Python 2 , 96 байт

i=0
g=input()
while 1:i+=1;c={k:i/4**k%4for k in sum(g,())};all(c[s]^c[t]for s,t in g)>0<exit(c)

Спробуйте в Інтернеті!

гiccc

Введення планарне, тому знайти 4-кольорові кольори завжди можливо.

(Таким чином: це знаходить лексикографічно найдавніше забарвлення в певному сенсі, і робить це дуже неефективно.)

кi4кмод4кi


Приємні зусилля, але я вважаю, що вам не вистачає одного компонента. Як щодо випадку, коли вузол оточений 5 різними кольорами?
Дон Тисяча

Я спробую створити тестовий випадок, щоб вирішити це
Дон Тисяча

Припустимо, що даний вузол у вашому графіку оточений 5 іншими вузлами, якими ви вже забарвлювали 5 дозволених вам кольорів.
Дон Тисяча

1
Мій код випадковим чином генерує кольорові графіки та перевіряє їх, поки він не створить правильне забарвлення графіка, яке потім друкує після виходу. У випадку, коли ви описуєте, воно починається заново, і, сподіваємось, не забарвлюйте ці 5 вузлів, всі 5 доступних кольорів.
Лінн

2
Тепер він перевіряє всі забарвлення в лексикографічному порядку :), так що це детерміновано і O (5 ^ n), але набагато повільніше для більшості входів.
Лінн

3

JavaScript (ES7), 80 76 74 байт

Збережено 2 байти завдяки @Neil

Той самий підхід, що і Лінн . Розв’язується в 4 кольорах, нумерованих від 0 до 3 .

a=>{for(x=0;a.some(a=>a.map(n=>z=c[n]=x>>n*2&3)[0]==z,c={});x++);return c}

Спробуйте в Інтернеті!


Якщо вам дозволено 4-х забарвлення, то чому б ні x>>n+n&3?
Ніл

@Neil Ах, так, спасибі Я відволікався на пояснення щодо 5-кольорового забарвлення і забув, що введення було гарантовано вирішуваним у 4.
Арнольд

3

Брахілог , 38 байт

cd{∧4>ℕ}ᶻ.g;?z{tT&h⊇ĊzZhpT∧Zt≠}ᵐ∧.tᵐ≜∧

Спробуйте в Інтернеті!

Пояснення

Example input: [["a","b"],["c","b"]]

cd                                       Concatenate and remove duplicates: ["a","b","c"]
  {∧4>ℕ}ᶻ.                               The output is this list zipped zith integers that
                                           are in [0..4]: [["a",I],["b",J],["c",K]]
         .g;?z                           Zip the output with the input:
                                           [[[["a",I],["b",J],["c",K]],["a","b"]],[["a",I],["b",J],["c",K]],["c","b"]]
              {               }ᵐ∧        Map for each element
               tT                        Call T the couple of nodes denoting an edge
                 &h⊇Ċ                    Take a subset of 2 elements in the head
                     zZ                  Zip and call it Z
                      ZhpT               The nodes in Z are T up to a permutation
                          ∧Zt≠           The integers in Z are all different color
                                 .tᵐ≜∧   Label the integers (i.e. colors) in the output so that
                                           it matches the set constraints

1

Python 2 , 211 байт

def f(g):
 g={k:[(a,b)[a==k]for a,b in g if k in(a,b)]for k in sum(g,())};c={k:0 for k in g}
 for a,b in sorted(g.iteritems(),key=lambda a:len(a[1])):c={k:(c[k],c[k]+1)[c[a]==c[k]and k in b]for k in c}
 return c

Спробуйте в Інтернеті!

Детермінований! Ймовірно, не вдасться на більш складних тестових випадках, але я занадто згорілий, щоб знайти графік, для якого він не вдається. Більше тестових випадків і критики вітаються!



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.