// Peut-on colorier les n sommets d'un graphe avec m couleurs sans que deux sommets adjacents // aient la même couleur ? // https://www.geeksforgeeks.org/m-coloring-problem-backtracking-5/ #include using namespace std; void printSolution(const vector &color); // Vérifier s'il est possible d'assigner la couleur color au sommet v bool isSafe(int v, const vector> &graph, const vector &color, int c) { for(size_t i = 0; i < graph.size(); i++) // Si un voisin direct i de v a déjà la couleur c : if(graph[v][i] && c == color[i]) return false; return true; } // isSafe() // Fonction récursive pour le problème du m-coloriage : bool graphColoringUtil(const vector> &graph, int m, vector &color, int v) { int n = graph.size(); // Cas de base : tous les sommets ont une couleur, c'est gagné if(v == n) return true; // Sinon on essaye d'assigner une couleur c au sommet v for(int c = 1; c <= m; c++) { // On vérifie si on peut donner la couleur c à v if(isSafe(v, graph, color, c)) { color[v] = c; // Appel récursif sur les autres sommets if(graphColoringUtil(graph, m, color, v + 1)) return true; // Backtracking : si l'assignation de c à v ne mène pas à une solution, // on l'enlève color[v] = 0; } } // Si aucune couleur ne peut être assignée à v, on retourne faux return false; } // graphColoringUtil() // Fonction appelée du main() et qui appelle graphColoringUtil() pour résoudre // le problème du m-coloriage bool graphColoring(const vector> &graph, const int m) { int n = graph.size(); // nombre de sommets (vertex) // Initialize all color values as 0. // This initialization is needed correct functioning of isSafe() vector color(n, 0); // Call graphColoringUtil() for vertex 0 if(graphColoringUtil(graph, m, color, 0) == false) { cout << "No solution.\n"; return false; } // Print the solution printSolution(color); return true; } // graphColoring() // Affichage d'une solution void printSolution(const vector &color) { for(auto &c : color) cout << c << ' '; cout << '\n'; } // printSolution() int main() { int n = 0, m = 0; cin >> n >> m; // nombre de sommets, nombre de couleurs auto graph = vector>(n, vector(n)); // matrice d'adjacences for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) { int x; cin >> x; graph[i][j] = ((x == 0) ? false : true); } graphColoring(graph, m); return 0; } // main()