colorazione di grafi
Dato un grafo connesso , si vuole trovare il minimo numero di colori necessari per colorare i nodi dell’albero in modo che nodi adiacenti abbiano sempre colori distinti.
- un grafo può richiedere anche colori.
teorema dei quattro colori
Un grafo planare richiede al più quattro colori per essere colorato.
non è noto nessun algoritmo polinomiale che determini la 3-colorabilità
2-colorabilità
È invece facile determinare se un grafo è 2-colorabile:
un grafo è 2-colorabile se e solo se non contiene cicli di lunghezza dispari
L’algoritmo di bi-colorazione che prova che un grafo senza cicli dispari può sempre essere 2-colorato funziona così:
- colora il nodo 0 con il colore 0
- effettua una visita in profondità del grafo a partire dal nodo 0 - nel corso della visita, assegna ad ogni nodo il colore (tra 0 e 1) opposto a quello assegnato al suo nodo padre
prova di correttezza
Siano e due nodi adiacenti in . Consideriamo i due casi e verifichiamo che, in ogni caso, i due nodi avranno colori opposti.
- L’arco viene attraversato durante la visita ⇒ banalmente i due nodi hanno colori diversi
- L’arco non viene attraversato durante la visita:
- sia il nodo visitato prima. Esiste un cammino che da porta a - questo cammino si chiuderà a formare un ciclo con l’arco . Per ipotesi, il ciclo è di lunghezza pari, quindi il cammino è di lunghezza dispari. Poiché sul cammino i colori si alternano, il primo nodo () e il secondo () avranno colori diversi.
algoritmo di bi-colorazione (sapendo che non ha cicli dispari):
- se contiene cicli dispari, produce una colorazione sbagliata
def Colora(x, G, Colore, c):
Colore[x] = c
for y in G[x]:
if Colore[y] == -1: # se non colorato
Colora(y, G, Colore, 1-c)
# 1-c alterna i colori (1-0 = 1, 1-1 = 0)
Colore = [-1]*len(G)
Colora(0, G, Colore, 0)
return Colore
algoritmo che produce una bi-colorazione se è bicolorabile, altrimenti ritorna una lista vuota:
def Colora(x, G, Colore, c):
Colore[x] = c
for y in G[x]:
if Colore[y]==-1:
if not Colora(y, G, Colore, 1-c):
return False
elif Colore[y] == Colore[x]:
return False
return True
def main()
Colore = [-1]*len(G)
if Colora(0, G, Colore, 0):
return Colore
return []
- la complessità è quella di una semplice visita di un grafo connesso: (in un grafo connesso, )