中国地图四色染色问题.docx

上传人:b****3 文档编号:3678985 上传时间:2022-11-24 格式:DOCX 页数:8 大小:123.59KB
下载 相关 举报
中国地图四色染色问题.docx_第1页
第1页 / 共8页
中国地图四色染色问题.docx_第2页
第2页 / 共8页
中国地图四色染色问题.docx_第3页
第3页 / 共8页
中国地图四色染色问题.docx_第4页
第4页 / 共8页
中国地图四色染色问题.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

中国地图四色染色问题.docx

《中国地图四色染色问题.docx》由会员分享,可在线阅读,更多相关《中国地图四色染色问题.docx(8页珍藏版)》请在冰豆网上搜索。

中国地图四色染色问题.docx

中国地图四色染色问题

中国地图四色染色问题

 

 

————————————————————————————————作者:

————————————————————————————————日期:

 

中国地图四色染色问题

一、问题描述

将中国地图用四种不同的颜色红、蓝、绿、黄来染色,要求相邻的省份染色不同,有多少种不同的方案?

二、问题分析

本文将中国地图的34个省、直辖市、自治区、以及特别行政区转化为图论中的图模型。

其中每个省、市、自治区、特别行政区用图中的一个结点表示,两个结点间联通仅当两个板块接壤。

则问题转化为图论中的染色问题。

由于海南、台湾省不与其它任何省份相邻,所以如果除海南、台湾外如果有n种染色方法,那么加上海南和台湾省后,有4*4*n种染色方法。

下面考虑除海南和台湾后的32个结点的染色方法。

三、中国地图染色方法

采用分开海南和台湾省的分析方法,一方面的原因是除海南和台湾后的32个结点,可以组成一个联通图,因为海南省和台湾省不和任何其它省份邻接。

另一方面,我们建立一个联通图模型后,染色问题可以用深度优先遍历算法DFS,或者广度优先遍历算法BFS来解决,由于该方法的时间复杂度较高,属于暴力法,少考虑两个省份可以减少计算机处理此问题的时间。

本文采用DFS算法来解决这个染色问题。

3.1DFS算法简介

DFS算法是图的一种图的深度遍历算法,即按照往深的地方遍历一个图,若到一个分支的尽头,则原路返回到最近一个未被遍历的结点,继续深度遍历。

DFS遍历的具体步骤可为下:

1)标记图中所有结点为“未访问”标记。

2)输出起始结点,并标记为“访问”标记

3)起始结点入栈

4)若栈为空,程序结束;若栈不为空,取栈顶元素,若该元素存在未被访问的邻接顶点,则输出一个邻接顶点,并置为“访问”状态,入栈;否则,该元素退出栈顶。

3.2 染色问题中的DFS算法设计

ﻩ我们先对任一结点染色,然后用DFS从该结点出发,遍历该图,遍历的下一结点颜色染为与之相邻的结点不同的颜色即可。

如果该结点无法染色则回到上一个结点重新染色,直到所有的结点都被染色即可。

最后统计染色种数。

染色问题的算法伪代码可以描述如下:

color_DFS(当前染色结点):

ﻩforiin所有颜色

ﻩﻩ{while  j的已染色邻接点

ﻩif 结点j相邻接点被染成i颜色

ﻩﻩﻩﻩ标记并break

ﻩﻩif 未被标记

ﻩ{

当前结点染为i色

ﻩﻩﻩif 当前结点为最后一个结点

ﻩﻩend

ﻩﻩelse

ﻩﻩﻩﻩcolor_DFS(next)

ﻩ}

3.3数据结构设计

为了实现DFS染色算法,我们需要设计相应的数据结构。

由于图的结点不多,只有32个,我们采用图的邻接矩阵来存储该图,记为map[33][33],map[0]不存储数据,如果两结点i,j相邻,map[i][j]=1,否则map[i][j]=0。

为了便于计算机编程,我们将每一个地名用相应结点号来表示,1:

"新疆",2:

"西藏",3:

"青海",4:

"甘肃",5:

"内蒙古",6:

"宁夏",7:

"黑龙江",8:

"吉林",9:

"辽宁",10:

"河北",11:

"北京",12:

"山西",13:

"陕西",14:

"山东",15:

"天津",16:

"河南",17:

"安徽",18:

"江苏",19:

"上海",20:

"浙江",21:

"福建",22:

"江西",23:

"广东",24:

"湖南",25:

"湖北",26:

"重庆",27:

"四川",28:

"贵州",29:

"云南",30:

"广西",31:

"香港",32:

"澳门"。

新疆和西藏相邻,那么我们就可以用map[1][2]=1来表示。

同样地,一种颜色我们也可以用一个数字来表示,在这里,我们用数字来代表颜色,比如1-红、2-蓝、3-绿、4-黄。

四、C语言代码实现

#include<stdio.h>

#include 

using namespace std;

charname[][10]={"","新疆","西藏","青海","甘肃","内蒙古","宁夏","黑龙江","吉林","辽宁","河北","北京","山西","陕西","山东","天津","河南","安徽","江苏","上海","浙江","福建","江西","广东","湖南","湖北","重庆","四川","贵州","云南","广西","香港","澳门"};

charcolor[][4]={"","红","蓝","绿","黄"};

intmap[33][33];

int vis[33];

intn,m;

long longcnt;//染色方法设置为long long防止溢出

voidinit_map()

map[1][2]=map[2][1]=1;//表示新疆和西藏连通

map[1][3]=map[3][1]=1;

   map[1][4]=map[4][1]=1;

map[2][3]=map[3][2]=1;

map[2][27]=map[27][2]=1;

 map[2][29]=map[29][2]=1;

map[3][4]=map[4][3]=1;

map[3][27]=map[27][3]=1;

map[4][5]=map[5][4]=1;

map[4][6]=map[6][4]=1;

  map[4][13]=map[13][4]=1;

 map[4][27]=map[27][4]=1;

map[5][6]=map[6][5]=1;

 map[5][7]=map[7][5]=1;

map[5][8]=map[8][5]=1;

 map[5][9]=map[9][5]=1;

 map[5][10]=map[10][5]=1;

map[5][12]=map[12][5]=1;

map[5][13]=map[13][5]=1;

map[6][13]=map[13][6]=1;

map[7][8]=map[8][7]=1;

 map[8][9]=map[9][8]=1;

map[9][10]=map[10][9]=1;

map[10][11]=map[11][10]=1;

map[10][12]=map[12][10]=1;

map[10][14]=map[14][10]=1;

 map[10][15]=map[15][10]=1;

  map[10][16]=map[16][10]=1;

map[11][15]=map[15][11]=1;

map[12][13]=map[13][12]=1;

  map[12][16]=map[16][12]=1;

map[13][16]=map[16][13]=1;

 map[13][25]=map[25][13]=1;

  map[13][26]=map[26][13]=1;

  map[13][27]=map[27][13]=1;

map[14][16]=map[16][14]=1;

 map[14][17]=map[17][14]=1;

 map[14][18]=map[18][14]=1;

   map[16][17]=map[17][16]=1;

 map[16][25]=map[25][16]=1;

 map[17][18]=map[18][17]=1;

  map[17][20]=map[20][17]=1;

map[17][22]=map[22][17]=1;

map[17][25]=map[25][17]=1;

map[18][19]=map[19][18]=1;

map[18][20]=map[20][18]=1;

 map[19][20]=map[20][19]=1;

 map[20][21]=map[21][20]=1;

   map[20][22]=map[22][20]=1;

map[21][22]=map[22][21]=1;

  map[21][23]=map[23][21]=1;

 map[22][23]=map[23][22]=1;

map[22][24]=map[24][22]=1;

  map[22][25]=map[25][22]=1;

map[23][24]=map[24][23]=1;

 map[23][30]=map[30][23]=1;

 map[23][31]=map[31][23]=1;

 map[23][32]=map[32][23]=1;

  map[24][25]=map[25][24]=1;

map[24][26]=map[26][24]=1;

map[24][28]=map[28][24]=1;

map[24][30]=map[30][24]=1;

 map[25][26]=map[26][25]=1;

 map[26][27]=map[27][26]=1;

map[26][28]=map[28][26]=1;

map[27][28]=map[28][27]=1;

   map[27][29]=map[29][27]=1;

map[28][29]=map[29][28]=1;

map[28][30]=map[30][28]=1;

map[29][30]=map[30][29]=1;

}

voiddfs(int now)//当前结点染色

{

  inti,j,k;

 for(i=1;i<=n;i++)//n种颜色

 {

 intflag=1;

  for(j =1;j<now; j++)

   {

   if(map[j][now]&&vis[j]==i)//j的邻接点被染为第i种颜色

  {

     flag=0;

    break;

 }

  }

  if(flag)

  {

     vis[now]=i;//当前结点染为第i种颜色

     if(now==m)//全部结点都已染色

  {

     cnt++;//种数+1

    /*if(cnt>=5)

     exit(0);

 for(k=1;k<=m;k++)//输出4组染色结果

    {

       printf("%s-%s ",name[k],color[vis[k]]);

    if(k%8==0)

      printf("\n");

    }

  printf("\n");*/

  }

      else

 dfs(now+1);//下一个结点染色

  }

 }

}

intmain()

{

  n=4;//4种颜色

 m=32;//32个省份

memset(map,0,sizeof(map));//地图全部置为0,表示未连通

  memset(vis,0,sizeof(vis));//每个顶点未染色

  init_map();//初始化图

cnt= 0;//染色方法数

 dfs(1);//从结点1开始染色

printf("%lld\n",cnt);

return0;

五、结果分析

本次实验在MAC_OS操作系统进行实验,处理器为2.8GHzIntel i7处理器,其计算结果为360516096,耗时约150s。

如果加上海南省和台湾省,其最终的计算结果为360516096*16=5768257536。

图1是部分染色结果(不包括台湾、海南省),事实上台湾海南省的染色任意。

图132个结点部分染色结果

六、总结

通过这个图论染色问题,加深了我对图论知识的理解。

我明白了如何将理论知识应用到实际问题中来。

虽然我以前也做过类似的地图染色实验,但是在这过程中我发现了自己的一些不足,比如说不够仔细,在构建一个邻接矩阵中多次忘记一些邻接边,以至于邻接矩阵错误。

总之,这次实验加强了我的动手能力以及解决问题的能力,加深了我对图论知识的理解和数据结构的应用能力,总之我收获颇多。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1