贪心法进行图着色

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

实验示例如下:

程序运行结果如下:

即着色结果如右图所示:

相关文档
最新文档