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à
- Se due nodi sono collegati da un bordo, i nodi sono colorati con colori diversi.
- 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
- Trova il nodo con il minor numero di nodi collegati ad esso. Questo nodo avrà al massimo 5 nodi collegati ad esso.
- Rimuovi questo nodo dal grafico.
- Chiama Color (N-1) su questo nuovo grafico per colorarlo.
- Aggiungi il nodo cancellato al grafico.
- Se possibile, colora il nodo aggiunto di un colore che nessuno dei suoi nodi connessi ha.
- Se non è possibile, tutti e 5 i nodi vicini al nodo aggiunto hanno 5 colori diversi, quindi dobbiamo provare il seguente processo.
- Numero i nodi che circondano il nodo aggiunto n1 ... n5
- Si consideri il sottografo di tutti i nodi nel grafico originale colorato dello stesso colore di n1 o n3.
- 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.
- 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 code-golf
- 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.
5
a 4
, e inviarli nuovamente.