Graph Colouring
Graph Coloring Problem
Graph coloring (also called vertex coloring) is a way of coloring a graph’s vertices such that no two adjacent vertices share the same color. This post will discuss a greedy algorithm for graph coloring and minimize the total number of colors used.
For example, consider the following graph:

We can color it in many ways by using the minimum of 3 colors.

Please note that we can’t color the above graph using two colors.
Before discussing the greedy algorithm to color graphs, let’s talk about basic graph coloring terminology.
K–colorable graph:
A coloring using at most k colors is called a (proper) k–coloring, and a graph that can be assigned a (proper) k–coloring is k–colorable.
K–chromatic graph:
The smallest number of colors needed to color a graph G is called its chromatic number, and a graph that is k–chromatic if its chromatic number is exactly k.
Brooks’ theorem:
Brooks’ theorem states that a connected graph can be colored with only x colors, where x is the maximum degree of any vertex in the graph except for complete graphs and graphs containing an odd length cycle, which requires x+1 colors.
Greedy coloring considers the vertices of the graph in sequence and assigns each vertex its first available color, i.e., vertices are considered in a specific order v1, v2, … vn, and vi and assigned the smallest available color which is not used by any of vi’s neighbors.
Greedy coloring doesn’t always use the minimum number of colors possible to color a graph. For a graph of maximum degree x, greedy coloring will use at most x+1 color. Greedy coloring can be arbitrarily bad; for example, the following crown graph (a complete bipartite graph), having n vertices, can be 2–colored (refer left image), but greedy coloring resulted in n/2 colors (refer right image).

#include <iostream>
#include <vector>
#include <unordered_map>
#include <set>
using namespace std;
// Data structure to store a graph edge
struct Edge {
int src, dest;
};
class Graph
{
public:
// a vector of vectors to represent an adjacency list
vector<vector<int>> adjList;
// Constructor
Graph(vector<Edge> const &edges, int n)
{
// resize the vector to hold `n` elements of type `vector<int>`
adjList.resize(n);
// add edges to the undirected graph
for (Edge edge: edges)
{
int src = edge.src;
int dest = edge.dest;
adjList[src].push_back(dest);
adjList[dest].push_back(src);
}
}
};
// Add more colors for graphs with many more vertices
string color[] =
{
"", "BLUE", "GREEN", "RED", "YELLOW", "ORANGE", "PINK",
"BLACK", "BROWN", "WHITE", "PURPLE", "VOILET"
};
// Function to assign colors to vertices of a graph
void colorGraph(Graph const &graph, int n)
{
// keep track of the color assigned to each vertex
unordered_map<int, int> result;
// assign a color to vertex one by one
for (int u = 0; u < n; u++)
{
// set to store the color of adjacent vertices of `u`
set<int> assigned;
// check colors of adjacent vertices of `u` and store them in a set
for (int i: graph.adjList[u])
{
if (result[i]) {
assigned.insert(result[i]);
}
}
// check for the first free color
int color = 1;
for (auto &c: assigned )
{
if (color != c) {
break;
}
color++;
}
// assign vertex `u` the first available color
result[u] = color;
}
for (int v = 0; v < n; v++)
{
cout << "The color assigned to vertex " << v << " is "
<< color[result[v]] << endl;
}
}
// Greedy coloring of a graph
int main()
{
// vector of graph edges as per the above diagram
vector<Edge> edges = {
{0, 1}, {0, 4}, {0, 5}, {4, 5}, {1, 4}, {1, 3}, {2, 3}, {2, 4}
};
// total number of nodes in the graph (labelled from 0 to 5)
int n = 6;
// build a graph from the given edges
Graph graph(edges, n);
// color graph using the greedy algorithm
colorGraph(graph, n);
return 0;
}Output: The color assigned to vertex 0 is BLUE The color assigned to vertex 1 is GREEN The color assigned to vertex 2 is BLUE The color assigned to vertex 3 is RED The color assigned to vertex 4 is RED The color assigned to vertex 5 is GREEN
The time complexity of the above solution is O(V × E), where V and E are the total number of vertices and edges in the graph, respectively.
Applications of graph coloring:
The problem of coloring a graph arises in many practical areas such as pattern matching, designing seating plans, scheduling exam timetable, solving Sudoku puzzles, etc.
Last updated
Was this helpful?