有错误的地方欢迎大家来指正、
贪心算法:要求问题具有
最优子结构
,在对问题
求解的过程中,总是做出在当前看来是
最好的
选
择。
也就是在对问题求解时,总是做出在
当前看来最好的选择,
不从整体最优解出发来考虑,所做出的是局部的最优解
描述:给定无向连通图G=(V,E),求图G的最小色数k,使得用k种颜色对G中的顶点着色,可使任意两个相邻顶点着色不同。
考虑顶点顺序1,2,3,4,5得到的最优解:1,3,4着一个颜色,2,5着一个颜色,这样是一共有两个颜色。
考虑顶点顺序为1,5,2,3,4得到另一解,对比一下,需要三种颜色
设计算法
输入:无向连通图G=(V,E)
输出:最小色数k
- 所有顶点置未着色状态
- 颜色k初始化为0
- 循环直到所有顶点均着色
- 下一种颜色K+1
- 检测是否有颜色冲突:
- 若顶点i已着色,则到步骤3.2(继续检测是否有颜色冲突)
- 若顶点i着颜色k不冲突,则color[i]=k (记录已经着色的颜色个数)
- 输出各顶点的颜色
//着色函数
void colorgraph()
{
int k=0;
//flag检测着色是否完成,1代表未完成着色
int flag=1;
while(flag==1)
{
//取下一种颜色
k++;
flag=0;
//顶点依次着色
for(int i=0;i<n;i++)
{
if(color[i]==0)
{
color[i]=k;
//判断是否颜色冲突
if(!OK(i))
{
color[i]=0;
flag=1;
}
}
}
}
}
int OK(int i)
{
for(int j=0;j<n;j=++)
{
if(arc[i][j]==1&&color[i]==color[j])
return 0;
}
return 1;
}
其中arc[][]二维数组是记录顶点是否相邻,在创建无向图时,输入