Grafico 5-Colorazione


14

Onestamente, non posso credere che questo non sia già stato chiesto, ma eccolo qui

sfondo

Dato un semplice grafico planare non orientato (il grafico può essere disegnato nel piano senza intersezioni), è un teorema provato che il grafico è a 4 colori, un termine che esploreremo tra poco. Tuttavia, è molto più facile colorare un grafico a 5 colori, che è ciò su cui concentreremo la nostra sfida oggi.

Una colorazione k valida di un grafico è un'assegnazione di "colori" ai nodi del grafico con le seguenti proprietà

  1. Se due nodi sono collegati da un bordo, i nodi sono colorati con colori diversi.
  2. Attraverso il grafico, ci sono un massimo di 5 colori.

Detto questo, ti presenterò un algoritmo piuttosto semplice per 5 colori qualsiasi semplice grafico planare non orientato. Questo algoritmo richiede le seguenti definizioni

Raggiungibilità : se il nodo 1 è raggiungibile dal nodo 2, ciò significa che esiste una sequenza di nodi, ciascuno collegato al successivo da un bordo, in modo tale che il primo nodo sia il nodo 2 e l'ultimo sia il nodo 1. Si noti che, poiché i grafici non indirizzati sono simmetrici, se il nodo 1 è raggiungibile dal nodo 2, il nodo 2 è raggiungibile dal nodo 1.

Sottografo : un sottografo di un grafico di una determinata serie di nodi N è un grafico in cui i nodi del sottografo sono tutti in N e un bordo dal grafico originale si trova nel sottografo se e solo se entrambi i nodi sono collegati dal bordo sono a N.

Lascia che Colore (N) sia una funzione per colorare i grafici planari con N nodi con 5 colori. Definiamo la funzione di seguito

  1. Trova il nodo con il minor numero di nodi collegati ad esso. Questo nodo avrà al massimo 5 nodi collegati ad esso.
  2. Rimuovi questo nodo dal grafico.
  3. Chiama Color (N-1) su questo nuovo grafico per colorarlo.
  4. Aggiungi il nodo cancellato al grafico.
  5. Se possibile, colora il nodo aggiunto di un colore che nessuno dei suoi nodi connessi ha.
  6. Se non è possibile, tutti e 5 i nodi vicini al nodo aggiunto hanno 5 colori diversi, quindi dobbiamo provare il seguente processo.
  7. Numero i nodi che circondano il nodo aggiunto n1 ... n5
  8. Si consideri il sottografo di tutti i nodi nel grafico originale colorato dello stesso colore di n1 o n3.
  9. Se in questo sottografo, n3 non è raggiungibile da n1, nell'insieme di nodi raggiungibili da n1 (incluso n1), sostituire tutte le occorrenze del colore di n1 con n3 e viceversa. Ora colora il colore originale del nodo aggiunto n1.
  10. Se n3 era raggiungibile da n1 in questo nuovo grafico, eseguire il processo dal passaggio 9 sui nodi n2 e n4, anziché su n1 e n3.

Sfida

Dato un input di una lista edg (che rappresenta un grafico), colora il grafico, assegnando a ciascun nodo un valore.

Input : un elenco di spigoli nel grafico (ad es. [('a','b'),('b','c')...])

Si noti che la lista di inserimento sarà tale che se (a, b) è nell'elenco, (b, a) NON è nell'elenco.

Output : un oggetto contenente coppie di valori, in cui il primo elemento di ciascuna coppia è un nodo e il secondo il suo colore, ovvero, [('a',1),('b',2)...]o{'a':1,'b':2,...}

Puoi usare qualsiasi cosa per rappresentare i colori, dai numeri, ai caratteri, a qualsiasi altra cosa.

L'ingresso e l'uscita sono abbastanza flessibili, purché sia ​​abbastanza chiaro quali siano gli ingressi e le uscite.

Regole

  • Questa è una sfida di
  • Non è necessario utilizzare l'algoritmo che ho descritto sopra. È semplicemente lì per riferimento.
  • Per qualsiasi grafico, ci sono spesso molti metodi validi per colorarli. Finché la colorazione prodotta dal tuo algoritmo è valida, è accettabile.
  • Ricorda che il grafico deve essere di 5 colori.

Casi test

Utilizzare il seguente codice per testare la validità dei risultati della colorazione. Poiché esistono molti coloranti grafici validi per grafico, questo algoritmo controlla semplicemente la validità della colorazione. Vedi la documentazione per vedere come usare il codice.

Alcuni casi di test casuali (e piuttosto sciocchi) :

Caso di prova 2: Krackhardt Kite Graph [(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)]

Un output valido: {0: 4, 1: 3, 2: 3, 3: 2, 4: 4, 5: 1, 6: 0, 7: 4, 8: 3, 9: 4}

Nota : questi casi di test sono troppo piccoli per testare il comportamento più sfumato dell'algoritmo di colorazione, quindi costruire i tuoi grafici è probabilmente un buon test della validità del tuo lavoro.

Nota 2 : aggiungerò un altro pezzo di codice che rappresenterà presto la tua soluzione colorante.

Nota 3 : Non ho previsto gli algoritmi di colorazione casuali che sono stati presentati, il che è fantastico di PPCG! Tuttavia, se qualcuno potesse giocare a golf con un algoritmo più deterministico, sarebbe fantastico.


3
Il grafico di Petersen e Chvatal non è non planare?
Kroppeb,

1
@NicHartley Esistono ben note operazioni basate sulla trasposizione su matrici di adiacenza che colorano efficacemente i grafici. Allego un foglio quando ne trovo uno.
Don Mille,

1
Penso che sarebbe stato meglio limitare le soluzioni al tempo polinomiale o richiedere l'esecuzione di un caso di test di grandi dimensioni per forzare le soluzioni a utilizzare algoritmi grafici come quello che sembra avere in mente.
xnor

2
@xnor Mi sembra di aver imparato la mia lezione. Va bene! Pensare fuori dagli schemi dovrebbe essere premiato, non penalizzato.
Don mille

1
Sì, lo so, ma una domanda a 4 colorazione dovrebbe essere progettata in modo tale che la gente non può semplicemente prendere le loro risposte a questa domanda, il cambiamento 5a 4, e inviarli nuovamente.
Peter Taylor,

Risposte:


6

Python 2 , 96 byte

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)

Provalo online!

gioccc

L'input è planare, quindi è sempre possibile trovare una colorazione 4.

(Quindi: questo trova la colorazione lessicograficamente più antica in un certo senso, e lo fa in modo molto inefficiente.)

Kkiio4Kmod4Kio


Bello sforzo, ma credo che manchi un componente. Che dire del caso in cui un nodo è circondato da 5 colori diversi?
Don Mille

Proverò a costruire un caso di prova per risolvere questo problema
don Mille

Supponiamo che un dato nodo nel tuo grafico sia circondato da altri 5 nodi, di cui hai già colorato i 5 colori consentiti.
Don Mille

1
Il mio codice genera casualmente i colori dei grafici e li controlla fino a quando non genera una colorazione dei grafici corretta, che poi stampa all'uscita. Nel caso in cui lo descrivi, ricomincerei da capo e speriamo di non colorare quei 5 nodi in tutti e 5 i colori disponibili.
Lynn,

2
Ora controlla tutti i coloranti in ordine lessicografico :) quindi è deterministico e O (5 ^ n), ma molto più lento per la maggior parte degli input.
Lynn,

3

JavaScript (ES7), 80 76 74 byte

Salvato 2 byte grazie a @Neil

Stesso approccio di Lynn . Risolve in 4 colori, numerati da 0 a 3 .

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

Provalo online!


Se ti è permesso un 4 colori, allora perché no x>>n+n&3?
Neil,

@Neil Ah sì, grazie. Sono stato distratto dalla spiegazione sulla colorazione 5 e ho dimenticato che l'input era garantito per essere risolvibile in 4.
Arnauld

3

Brachylog , 38 byte

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

Provalo online!

Spiegazione

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 byte

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

Provalo online!

Deterministico! Probabilmente fallirebbe su casi di test più complicati, ma sono troppo sfinito per trovare un grafico per cui fallisce. Altri casi di test e critiche benvenute!


1

Pulito , 139 byte

import StdEnv,Data.List
$l#(a,b)=unzip l
#e=nub(a++b)
=hd[zip2 e c\\c<- ?e|all(\(a,b)=c!!a<>c!!b)l]
?[h:t]=[[n:m]\\n<-[0..4],m<- ?t]
?e=[e]

Provalo online!

Genera tutti i coloranti e restituisce il primo valido.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.