Grafın komşu düğümlerinin aynı renge boyanmaması koşuluyla, en fazla M adet renk kullanarak düğümleri boyayan geri izleme (backtracking) algoritmasıdır.
Graf Boyama (Graph Coloring), graf teorisinde en çok çalışılan NP-Zor (NP-Hard) problemlerden biridir. Amaç, grafın düğümlerini belirli sayıda renk kullanarak öyle boyamaktır ki, birbirine bağlı olan (adjacent) hiçbir iki düğüm aynı renge sahip olmasın.
M-Boyama Problemi, bu kısıt altında grafın M adet renk kullanılarak boyanıp boyanamayacağını sorgular.
Geri İzleme (Backtracking) algoritması, düğümlere sırayla renk ataması yapar. Her düğüme renk verirken komşularla çakışıp çakışmadığını denetler. Çakışma varsa sonraki rengi dener. Eğer düğüm için hiçbir renk geçerli olmazsa, bir önceki adıma (ebeveyn düğüme) geri dönerek onun rengini değiştirir ve arama ağacını budayarak ilerler.
Aşağıdaki uygulamalar PDF kaynaklarındaki pseudo kod akışını modern veri yapılarıyla ifade eder. Kenar durumları görünür bırakıldığı için örnekler doğrudan test edilebilir.
1function isSafe(2 node: number,3 graph: number[][],4 colors: number[],5 color: number6): boolean {7 for (let i = 0; i < graph.length; i++) {8 // Komşu düğüm aynı renge sahipse güvensizdir9 if (graph[node][i] === 1 && colors[i] === color) {10 return false;11 }12 }13 return true;14}1516function colorGraphRec(17 node: number,18 graph: number[][],19 m: number,20 colors: number[],21 trace: string[]22): boolean {23 if (node === graph.length) return true; // Tüm düğümler boyandı2425 for (let c = 1; c <= m; c++) {26 trace.push(`Düğüm ${node} için Renk ${c} deneniyor...`);27 if (isSafe(node, graph, colors, c)) {28 colors[node] = c;29 trace.push(` [Renk Atandı] Düğüm ${node} -> Renk ${c}`);30 31 if (colorGraphRec(node + 1, graph, m, colors, trace)) return true;32 33 trace.push(` [Geri İzleme - Backtrack] Düğüm ${node} rengi sıfırlanıyor (${c})`);34 colors[node] = 0; // Backtrack35 } else {36 trace.push(` [Çakışma] Renk ${c} komşularla çakışıyor.`);37 }38 }39 return false;40}4142function solveMColoring(graph: number[][], m: number, trace: string[]): number[] | null {43 const colors = Array(graph.length).fill(0);44 if (colorGraphRec(0, graph, m, colors, trace)) {45 return colors;46 }47 return null;48}Renk sayısı (M) ve kenarları girin. Sınırlı graf simüle edilir. Örnek: 3; 0-1, 1-2, 2-3, 3-0, 0-2
Renk sayısı (M) ve kenarları girin. Sınırlı graf simüle edilir. Örnek: 3; 0-1, 1-2, 2-3, 3-0, 0-2
En İyi Durum: O(V)
Ortalama Durum: O(M^V)
En Kötü Durum: O(M^V)
O(V) rekürsif çağrı yığını ve renk dizisi - Bu algoritmanın karmaşıklığı belirtilmemiş.
Graf Boyama (Graph Coloring & Backtracking) Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar: