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.

  1. L’arco viene attraversato durante la visita banalmente i due nodi hanno colori diversi
  2. 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, )