圖着色算法詳解(Graph Coloring)


圖着色算法描述:

https://www.jianshu.com/p/6a52b390f5fa

給定無向連通圖和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;
}  

運行結果:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM