4 Design a backtracking algorithm to color a simple graph with m colors. If such a coloring exists, print all valid colorings. We assume the graph is represented by an adjacent matrix A.
Solution:
Let C = {1, 2, …, m} be the set of m colors.
We use an n-tuple (x[1], x[2], …, x[n]) to represent a coloring, where x[i] Î C is the color for vertex i. A coloring is valid if, for every A[i, j] = 1, x[i] ¹ x[j].
Valid(k, c)
//input: x[1..k-1]
//This function will check if color c can be assigned to x[k] such that c ¹ x[i] if (k, i) is an edge, for i = 1, 2, …, k-1.
1 for i ¬ 1 to k-1
2 do if A[k, i] = 1 and x[i] = c
3 then return valid (k, c) = false
4 return valid (k, c) = true
5 End
m-color(k, n)
//input: x[1..k-1]
1 for c ¬ 1 to m
2 do if valid (k, c) = true
3 then { x[k] ¬ c
4 if k = n
5 then { coount¬count+1
6 output x[1..n]
7 }
8 else m-color(k+1, n)
9 }
10 End
The main algorithm is as follows.
Color(A[1..n, 1..n], m)
//input is matrix A[i,j]
1 count ¬ 0
2 m-color(1, n)
3 if count = 0
4 then return (‘not m-colorable’)
5 else return (‘There are’ count ‘colorings’)
6 End