贪心法进行图着色
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计利用贪心法对图着色
班级:110401班
姓名:***
学号:********
利用贪心法对图着色程序代码如下:
#include
int arc[100][100];
int n; //图中结点的总数
int color[100];
int buildGraph() //构建图的邻接矩阵
{
int vertexNum;
int arcNum;
int i,j,k;
printf("请输入结点总数!\n");
scanf("%d",&vertexNum);
n=vertexNum;
printf("请输入图中边的总数!\n");
scanf("%d",&arcNum);
for(i=1;i<=vertexNum;i++) //初始化邻接矩阵
{
for(j=1;j<=vertexNum;j++)
{
arc[i][j]=0;
}
}
for(k=1;k<=arcNum;k++)
{
if(k<=arcNum)
printf("请输入图中相连接的两个结点");
scanf("%d %d",&i,&j);
arc[i][j]=1;
arc[j][i]=1;
}
printf("\n该图的邻接矩阵为:\n");
for(i=1;i<=vertexNum;i++)
{
for(j=1;j<=vertexNum;j++)
{
printf("%d ",arc[i][j]);
}
printf("\n");
}
return 0;
}
int test(int m,int t) //判断是否冲突
{
int flag =1;
for(int j=1;j<=n;j++)
{
if(arc[m][j]==1&&color[j]==t)
flag=0;
}
if(flag==0)return 0;
else return 1;
}
int drawColor() //对结点进行着色
{
int k;
int m=n;
int i;
color[1]=1;
for(int i=2;i<=n;i++)
{
color[i]=0;
}
k=0;
//############################################ while(m>1)
{
k++;
for(i=2;i<=n;i++)
{
if(color[i]!=0)
{
continue;
}
int flag=test(i,k);
if(flag)
{
color[i]=k;
m--;
}
else continue;
}
}
//###################################################### printf("\n着色结果如下:\n");
for(i=1;i<=n;i++)
{
printf("结点颜色\n");
printf("%d %d\n",i,color[i]);
}
}
int main()
{
buildGraph();
drawColor();
return 0;
}
实验示例如下:
程序运行结果如下:
即着色结果如右图所示: