while (k>=1)
- 依次考察每一种颜色,若顶点k的着色与其他顶点的着色不发生冲突,则转步骤2);否则,搜索下一个颜色;
- 若顶点已全部着色,则输出数组color[n],返回;
- 否则,
A. 若顶点k是一个合法着色,则k=k+1,转步骤1)处理下一个顶点;
B. 否则,重置顶点k的着色情况,k=k-1,转步骤1)回溯;
#include<iostream>
using namespace std;
const int n=5;
int color[5];
int arc[5][5]={{0,1,1,0,0},{1,0,1,0,1},{1,1,0,1,1},{0,0,1,0,1},{0,1,1,1,0}};
int OK(int k){
for(int i=0;i<n;i++)
{
//判断有没有与k在的点相通
if(arc[k][i]==1&&color[k]==color[i])
return 0;
}
return 1;
}
void GraphColor(int m){
int i,k;
for(i=0;i<n;i++)
color[i]=0;
k=0;
while(k>=0)
{
color[k]=color[k]+1;
while(color[k]<=m)
if(OK(k))
break;
else
color[k]=color[k]+1;
if(color[k]<=m&&k==n-1)
{
for(i=0;i<n;i++)
cout<<color[i]<<" ";
return;
}
if(color[k]<=m&&k<n-1)
k++;
else
{
color[k]=0;
k--;
}
}
}
void main(){
GraphColor(3);
}
时间复杂度:O(m^n)
运行结果: