Golang
Golang

 

 

Graph coloring is a classic problem in computer science and mathematics, where the goal is to assign colors to the vertices of a graph such that no two adjacent vertices share the same color. The objective is to use the minimum number of colors possible, known as the graph’s chromatic number.

Program Structure

The Go program to color a graph using the minimum number of colors follows a backtracking approach. Here’s an overview of the program structure:

  • Graph Representation: The graph is represented using an adjacency matrix, where each cell indicates whether there’s an edge between two vertices.
  • Color Assignment: The program attempts to assign colors to each vertex, ensuring that no two adjacent vertices have the same color.
  • Backtracking: If a color assignment leads to a conflict, the program backtracks and tries a different color.
  • Optimization: The program keeps track of the minimum number of colors required to color the graph.

Go Program


package main

import (
    "fmt"
)

// Graph represents a graph using an adjacency matrix
type Graph struct {
    vertices int
    adjMatrix [][]bool
}

// NewGraph initializes a new graph with a given number of vertices
func NewGraph(vertices int) *Graph {
    adj := make([][]bool, vertices)
    for i := range adj {
        adj[i] = make([]bool, vertices)
    }
    return &Graph{vertices: vertices, adjMatrix: adj}
}

// AddEdge adds an edge between vertex u and vertex v
func (g *Graph) AddEdge(u, v int) {
    if u >= g.vertices || v >= g.vertices || u < 0 || v < 0 {
        fmt.Println("Invalid edge!")
        return
    }
    g.adjMatrix[u][v] = true
    g.adjMatrix[v][u] = true
}

// isSafe checks if it's safe to assign color c to vertex v
func (g *Graph) isSafe(v int, color []int, c int) bool {
    for i := 0; i < g.vertices; i++ {
        if g.adjMatrix[v][i] && color[i] == c {
            return false
        }
    }
    return true
}

// graphColoringUtil recursively assigns colors to vertices
func (g *Graph) graphColoringUtil(v int, m int, color []int) bool {
    // All vertices are colored
    if v == g.vertices {
        return true
    }

    // Try different colors for vertex v
    for c := 1; c <= m; c++ {
        if g.isSafe(v, color, c) {
            color[v] = c
            // Recur to assign colors to the rest
            if g.graphColoringUtil(v+1, m, color) {
                return true
            }
            // If assigning color c doesn't lead to a solution, remove it
            color[v] = 0
        }
    }
    // If no color can be assigned to this vertex
    return false
}

// graphColoring finds the minimum number of colors needed to color the graph
func (g *Graph) graphColoring() int {
    // Initialize result
    result := 0
    // Try different numbers of colors starting from 1
    for m := 1; m <= g.vertices; m++ {
        color := make([]int, g.vertices)
        if g.graphColoringUtil(0, m, color) {
            result = m
            fmt.Printf("Solution exists with %d colors:\n", m)
            for i := 0; i < g.vertices; i++ { fmt.Printf("Vertex %d -> Color %d\n", i, color[i])
            }
            return result
        }
    }
    return result
}

func main() {
    // Example usage
    // Create a graph with 4 vertices
    g := NewGraph(4)
    // Add edges
    g.AddEdge(0, 1)
    g.AddEdge(0, 2)
    g.AddEdge(1, 2)
    g.AddEdge(1, 3)
    
    // Perform graph coloring
    minColors := g.graphColoring()
    fmt.Printf("Minimum number of colors required: %d\n", minColors)
}
    

Documentation

The Go program is designed to determine the minimum number of colors required to color a graph such that no two adjacent vertices share the same color. Here’s a detailed explanation of each component:

Graph Representation

The Graph struct represents a graph using an adjacency matrix. An adjacency matrix is a 2D slice where each cell adjMatrix[i][j] indicates whether there’s an edge between vertex i and vertex j.

NewGraph Function

The NewGraph function initializes a new graph with a specified number of vertices. It creates an adjacency matrix filled with false, indicating no edges initially.

AddEdge Method

The AddEdge method adds an undirected edge between two vertices u and v. It updates the adjacency matrix to reflect the presence of the edge.

isSafe Method

The isSafe method checks whether it’s safe to assign a particular color c to vertex v. It ensures that no adjacent vertex has the same color.

graphColoringUtil Method

The graphColoringUtil method is a recursive utility function that attempts to assign colors to all vertices using backtracking. It tries all possible colors for each vertex and backtracks if a conflict is detected.

graphColoring Method

The graphColoring method determines the minimum number of colors required to color the graph. It starts with one color and incrementally increases the number of colors until a valid coloring is found. Once a solution is found, it prints the color assignments for each vertex.

Main Function

The main function demonstrates how to use the graph coloring implementation. It creates a graph with four vertices, adds edges between them, and then calls the graphColoring method to determine and display the minimum number of colors required.

Example Output

For the provided example graph, the program outputs:


Solution exists with 3 colors:
Vertex 0 -> Color 1
Vertex 1 -> Color 2
Vertex 2 -> Color 3
Vertex 3 -> Color 1
Minimum number of colors required: 3
    

How the Program Works

  1. Initialization: A new graph is created with a specified number of vertices.
  2. Adding Edges: Edges are added between vertices to define the graph’s structure.
  3. Color Assignment: The program attempts to assign colors to each vertex, starting with the minimum number of colors.
  4. Backtracking: If assigning a color leads to a conflict (i.e., two adjacent vertices have the same color), the program backtracks and tries a different color.
  5. Result: Once a valid coloring is found with the minimum number of colors, the program prints the color assignments and the total number of colors used.

Conclusion

Graph coloring is a fundamental problem with applications in scheduling, register allocation, and more. This Go program provides a clear and efficient way to determine the minimum number of colors required to color a graph using a backtracking approach. By understanding and utilizing this implementation, developers can tackle complex graph-related problems with ease.

Excerpt

Graph coloring in Go: A backtracking approach to assign minimum colors to graph vertices, ensuring no adjacent vertices share the same color.

 

By Aditya Bhuyan

I work as a cloud specialist. In addition to being an architect and SRE specialist, I work as a cloud engineer and developer. I have assisted my clients in converting their antiquated programmes into contemporary microservices that operate on various cloud computing platforms such as AWS, GCP, Azure, or VMware Tanzu, as well as orchestration systems such as Docker Swarm or Kubernetes. For over twenty years, I have been employed in the IT sector as a Java developer, J2EE architect, scrum master, and instructor. I write about Cloud Native and Cloud often. Bangalore, India is where my family and I call home. I maintain my physical and mental fitness by doing a lot of yoga and meditation.

Leave a Reply

Your email address will not be published. Required fields are marked *

error

Enjoy this blog? Please spread the word :)