圖着色算法詳解(Graph Coloring)

圖着色算法描述:ios

https://www.jianshu.com/p/6a52b390f5fac++

給定無向連通圖和m種不一樣的顏色。用這些顏色爲圖G的各頂點着色,每一個頂點着一種顏色。是否有一種着色法使G中每條邊的兩個頂點有不一樣的顏色。算法

這個問題是圖的m可着色斷定問題。若一個圖最少須要m種顏色才能使圖中每條邊相鏈接的兩個頂點着不一樣顏色,稱這個數m爲這個圖的色數。數組

求一個圖的色數m稱爲圖的m可着色優化問題。 給定一個圖以及m種顏色,請計算出塗色方案數。函數


 
 

分析:

        細緻分析後,t表明頂點仍是能分析出來的。
  使用到了鄰接矩陣
  還有就是color數組,也是解題的關鍵,要明確color數組表明的含義:color[n],大小爲n,下標確定表明頂點,裏面的值表明這個頂點放的是哪一種顏色。
  Traceback(t)的t表明某一個頂點,這個頂點具體放哪一種顏色不知道,確定有個for循環從第一種顏色到最後一種顏色都要試一下,那麼color[t]裏就放當前這種顏色。OK(t)判斷一下,若是能夠,traceback(t+1)。
  OK(t)中,t頂點和哪些頂點有聯繫,我就去判斷這些點放置的顏色有沒有和我相同,如有相同的,return false;不然,return true。優化

 

#include<stdio.h>
#include<iostream>
#define V 4//圖中的頂點數
/* 打印解決方案的實用函數 */
void printSolution(int color[])
{
	printf(" Following are the assigned colors \n");
	for (int i = 0; i < V; i++)
		printf(" %d ", color[i]);
	printf("\n");
}
bool isSafe(int v, bool graph[V][V], int color[], int c)////用於檢查當前顏色分配的實用程序函數
{
	for (int i = 0; i < V; i++)

	if (graph[v][i] && c == color[i])
		return false;
	return true;
}

void graphColoring(bool graph[V][V], int m, int color[], int v)//求解m着色問題的遞推效用函數
{

	if (v == V)//基本狀況:若是全部頂點都指定了顏色,則返回真
	{
		printSolution(color);
		return;
	}
	/* 考慮這個頂點v並嘗試不一樣的顏色*/
	for (int c = 1; c <= m; c++)
	{
		/* 檢查顏色C到V的分配是否正確*/
		if (isSafe(v, graph, color, c))
		{
			color[v] = c;
			/* 遞歸爲其他頂點指定顏色 */
			graphColoring(graph, m, color, v + 1);
			/* 若是指定顏色C不會致使解決方案而後刪除它 */
			color[v] = 0;
		}
	}
}
// driver program to test above function
int main()
{
	/* Create following graph and test whether it is 3 colorable
	(3)---(2)
	|   / |
	|  /  |
	| /   |
	(0)---(1)
	*/
	bool graph[V][V] = { { 0, 1, 1, 1 },
	{ 1, 0, 1, 0 },
	{ 1, 1, 0, 1 },
	{ 1, 0, 1, 0 },
	};
	int m = 3; // Number of colors

	int color[V];
	for (int i = 0; i < V; i++)
		color[i] = 0;
	graphColoring(graph, m, color, 0);
	system("pause");
	return 0;
}  

運行結果:spa

 

相關文章
相關標籤/搜索