地图着色问题实验报告

算法设计与分析课程设计

题目: 地图着色问题 文档:

物联网工程 学院业

学 号

学生姓名 班 级

二〇一三年十二月

一、问题描述:

地图着色问题

设计要求:已知中国地图, 对各省进行着色, 要求相邻省所使用的颜色不同, 并保证使用的颜色总数最少.

二、概要设计(流程图)

步骤:1.已知中国地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少;

2.将各省进行编号,然后利用无向图的顶点之间的边来表示各省的相邻关系;

3.将各编号进行逐一着色,利用循环语句遍历各省,判断语句判断是否符合要求;

4.演示程序,以用户和计算机的对话方式进行;

5.最后对结果做出简单分析及总结。

流程图

三、源程序

#include

#include

#define MAXedg 100

#define MAX 0

#define N 4 /*着色的颜色数*/

int color[30]={0};/*来存储对应块的对应颜色*/

typedef char vextype;

typedef int adjtype;

typedef struct /*定义图*/

{

vextype vexs[MAXedg]; /*存放边的矩阵*/

adjtype arcs[MAXedg][MAXedg]; /*图的邻接矩阵*/

int vnum,arcnum; /*图的顶点数和边数*/

}Graph;

int LocateVex(Graph G,char u)

{

int i;

for(i=1;i

{

if(u==G.vexs[i])

return i;

}

if(i==G.vnum)

{

printf("Error u!\n");

exit(1);

}

return 0;

}

void CreateGraph(Graph &G) /*输入图*/

{

int i,j,k, w;

vextype v1,v2;

printf("输入图的顶点数和边数:\n");

scanf("%d%d",&G.vnum,&G.arcnum);

getchar();

printf("输入图的各顶点:\n");

for(i=1;i

{

scanf("%c",&G.vexs[i]);

getchar();

}

for(i=0;i

for(j=0;j

G.arcs[i][j]=MAX;

printf("输入边的两个顶点和权值(均用1表示):\n");

for(k=0;k

{

scanf("%c", &v1);getchar();

scanf("%c", &v2);getchar();

scanf("%d", &w); getchar();

i=LocateVex(G,v1);

j=LocateVex(G,v2);

G.arcs[i][j]=w;

G.arcs[j][i]=w;

}

void PrintGraph(Graph G) /*输出图的信息*/

{

int i,j;

printf("图的各顶点:\n");

for(i=1;i

printf("%c ",G.vexs[i]);

printf("\n");

printf("图的邻接矩阵:\n");

for(i=1;i

{

for(j=1;j

printf("%d ",G.arcs[i][j]);

printf("\n");

}

}

int colorsame(int s,Graph G)/*判断这个颜色能不能满足要求*/

{

int i,flag=0;

for(i=1;i

if(G.arcs[i][s]==1&&color[i]==color[s])

{

flag=1;break;

}

return flag;

}

void output(Graph G)/*输出函数*/

int i;

for(i=1;i

printf("%d ",color[i]);

printf("\n");

}

void trycolor(int s,Graph G)/*s为开始图色的顶点,本算法从1开始*/

{

int i;

if(s>G.vnum)/*递归出口*/

{

output(G);

exit(1);

}

else

{

for(i=1;i

{

color[s]=i;

if(colorsame(s,G)==0)

trycolor(s+1,G);/*进行下一块的着色*/

}

}

}

int main()

{

Graph G;

CreateGraph(G);

PrintGraph(G);

printf("着色方案:\n");

trycolor(1,G);

return 0;

}

四、运行主要结果界面贴图

1、中国地图简略图

2、取地图一部分进行测试

有6个顶点,8条边。

各点相邻情况为:a-b ,a-e ,b-c ,b-d ,b-e ,c-d, d-e e-f

3、运行结果

五、总结

对中国地图着色即图着色问题,用m 种颜色来为无向图着色,其中顶点个数为n 。为此,用一个n 元组来描述图的一种着色。在这种着色中,所有相邻的顶点都不会具有相同的颜色,这种着色就是有效着色。根据这种思想编写中国地图着色算法,算法主要使用回溯法。根据算法运行,可以看出,无论有多少点,点与点之间怎样相邻,都只需要4种颜色就可以完成着色。

通过此次对中国地图着色问题的探究,我更好更深入了学习了着色问题中回溯法的运用,在课堂上学习的理论知识只有运用到实践里才能被更好的掌握。

算法设计与分析课程设计

题目: 地图着色问题 文档:

物联网工程 学院业

学 号

学生姓名 班 级

二〇一三年十二月

一、问题描述:

地图着色问题

设计要求:已知中国地图, 对各省进行着色, 要求相邻省所使用的颜色不同, 并保证使用的颜色总数最少.

二、概要设计(流程图)

步骤:1.已知中国地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少;

2.将各省进行编号,然后利用无向图的顶点之间的边来表示各省的相邻关系;

3.将各编号进行逐一着色,利用循环语句遍历各省,判断语句判断是否符合要求;

4.演示程序,以用户和计算机的对话方式进行;

5.最后对结果做出简单分析及总结。

流程图

三、源程序

#include

#include

#define MAXedg 100

#define MAX 0

#define N 4 /*着色的颜色数*/

int color[30]={0};/*来存储对应块的对应颜色*/

typedef char vextype;

typedef int adjtype;

typedef struct /*定义图*/

{

vextype vexs[MAXedg]; /*存放边的矩阵*/

adjtype arcs[MAXedg][MAXedg]; /*图的邻接矩阵*/

int vnum,arcnum; /*图的顶点数和边数*/

}Graph;

int LocateVex(Graph G,char u)

{

int i;

for(i=1;i

{

if(u==G.vexs[i])

return i;

}

if(i==G.vnum)

{

printf("Error u!\n");

exit(1);

}

return 0;

}

void CreateGraph(Graph &G) /*输入图*/

{

int i,j,k, w;

vextype v1,v2;

printf("输入图的顶点数和边数:\n");

scanf("%d%d",&G.vnum,&G.arcnum);

getchar();

printf("输入图的各顶点:\n");

for(i=1;i

{

scanf("%c",&G.vexs[i]);

getchar();

}

for(i=0;i

for(j=0;j

G.arcs[i][j]=MAX;

printf("输入边的两个顶点和权值(均用1表示):\n");

for(k=0;k

{

scanf("%c", &v1);getchar();

scanf("%c", &v2);getchar();

scanf("%d", &w); getchar();

i=LocateVex(G,v1);

j=LocateVex(G,v2);

G.arcs[i][j]=w;

G.arcs[j][i]=w;

}

void PrintGraph(Graph G) /*输出图的信息*/

{

int i,j;

printf("图的各顶点:\n");

for(i=1;i

printf("%c ",G.vexs[i]);

printf("\n");

printf("图的邻接矩阵:\n");

for(i=1;i

{

for(j=1;j

printf("%d ",G.arcs[i][j]);

printf("\n");

}

}

int colorsame(int s,Graph G)/*判断这个颜色能不能满足要求*/

{

int i,flag=0;

for(i=1;i

if(G.arcs[i][s]==1&&color[i]==color[s])

{

flag=1;break;

}

return flag;

}

void output(Graph G)/*输出函数*/

int i;

for(i=1;i

printf("%d ",color[i]);

printf("\n");

}

void trycolor(int s,Graph G)/*s为开始图色的顶点,本算法从1开始*/

{

int i;

if(s>G.vnum)/*递归出口*/

{

output(G);

exit(1);

}

else

{

for(i=1;i

{

color[s]=i;

if(colorsame(s,G)==0)

trycolor(s+1,G);/*进行下一块的着色*/

}

}

}

int main()

{

Graph G;

CreateGraph(G);

PrintGraph(G);

printf("着色方案:\n");

trycolor(1,G);

return 0;

}

四、运行主要结果界面贴图

1、中国地图简略图

2、取地图一部分进行测试

有6个顶点,8条边。

各点相邻情况为:a-b ,a-e ,b-c ,b-d ,b-e ,c-d, d-e e-f

3、运行结果

五、总结

对中国地图着色即图着色问题,用m 种颜色来为无向图着色,其中顶点个数为n 。为此,用一个n 元组来描述图的一种着色。在这种着色中,所有相邻的顶点都不会具有相同的颜色,这种着色就是有效着色。根据这种思想编写中国地图着色算法,算法主要使用回溯法。根据算法运行,可以看出,无论有多少点,点与点之间怎样相邻,都只需要4种颜色就可以完成着色。

通过此次对中国地图着色问题的探究,我更好更深入了学习了着色问题中回溯法的运用,在课堂上学习的理论知识只有运用到实践里才能被更好的掌握。


相关内容

  • 世界数学难题--四色猜想
  • 世界数学难题--四色猜想 平面内至多可以有四个点构成每两个点两两连通且连线不相交. 可用符号表示:K (n) ,n=. 四色原理简介 这是一个拓扑学问题,即找出给球面(或平面)地图着色时所需用的不同颜色的最小数目.着色时要使得没有两个相邻(即有公共边界线段)的区域有相同的颜色.1852年英国的格思里 ...

  • "四色定理"简捷证明(完整版)
  • "四色定理"简捷证明 王若仲(王洪) 贵州省务川自治县实验学校贵州564300摘要:1852年,毕业于伦敦大学的格斯里(FrancisGuthrie)来到一家科研单位搞地图着色工作时,发现每幅地图都可以只用四种颜色着色.这个现象能不能从数学上加以严格证明呢?1872年,英国当时最 ...

  • 图着色问题
  • 回溯经典-m 图着色问题(转) 四色问题: 四色问题是m 图着色问题的一个特列,根据四色原理,证明平面或球面上的任何地图的所有区域都至多可用四种.颜色来着色,并使任何两个有一段公共边界的相邻区域没有相同的颜色.这个问题可转换成对一平面图的4-着色判定问题(平面图是一个能画于平面上而边无任何交叉的图) ...

  • 浅析四色猜想的证明
  • 浅析四色猜想的证明 学生姓名:杨彩娟 指导老师:冯源 摘 要 四色定理是世界三大数学难题之一,许多数学家多年来都热衷于它的证明,力求寻找更好 的非计算机证明方法,而四色猜想的讨论和证明也大大推动了图论的发展. 关键词: 图论: 四色猜想: 四色证明: 可约化构形 引言: 在日常生活中我们常常遇到组合 ...

  • 苹果着色剂实验报告
  • 关于靓透天在苹果上的实验效果 一.产品介绍 本品为新型果蔬增糖着色剂,代表着未来提质剂的发展方向.富含植物所必需有机螯合基质.钛.钾镁.各种微量元素及痕量元素,不含乙烯利等植物调节剂成分,不会对作物及果实造成伤害,使用安全,效果更好. 1.靓透天能增进植物生理活性,增强光合作用,提高叶绿素含量和过氧 ...

  • 钓鱼岛历史研究报告
  • 钓鱼岛历史研究报告(1) 黎蜗藤 钓鱼岛问题近日迅速超越南海问题,成为中国与邻国海疆争议的最大热点.和南海问题一样,钓鱼岛的问题出现的主要原因有两个,第一,这些无人居住的海岛在古代普遍缺乏关注,因此地位非常模糊.第二,在二战后,并没有就如何处理这些海岛的问题达成一致意见,以致越拖越复杂.当然,钓鱼岛 ...

  • 人教版七年级地理上册第二节教案
  • 第一章地球和地图 第二节 地球的运动 第一课时 地球的自转 教学目标 [情感.态度和价值观] 人类对地球的形状和大小的认识过程,体现着人类认识自然.追求真理,勇于探索的精神,以及科学不断发展进步的过程.因而教育学生要用动态的.发展的眼光认识地理事物的发生.演变和发展.培养学生认真学习的态度,探求自然 ...

  • 21世纪七大世界级数学难题
  • 世界级数学难题让几代数学家为止奋斗,而其中七个"千年数学难题"更是每个难题悬赏一百万美元. 百万的世界级数学难题 难题"之一:P (多项式算法)问题对NP (非多项式算法)问题 难题"之二: 霍奇(Hodge)猜想 难题"之三: 庞加莱(Poinca ...

  • 不锈钢电解着色工艺研究
  • 毕业设计(论文)开题报告 题目304不锈钢电解着色工艺研究 专 业 名 称 金属材料工程(腐蚀与防护) 班 级 学 号 08012421 学 生 姓 名 曾云辉 指 导 教 师 周 雅 填 表 日 期 2012 年 2 月 12 日 目 录 1选题的依据及意义 ................... ...