中国地图四色染色问题文档格式.docx
《中国地图四色染色问题文档格式.docx》由会员分享,可在线阅读,更多相关《中国地图四色染色问题文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
最后统计染色种数。
染色问题的算法伪代码可以描述如下:
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 <
iostream>
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个结点部分染色结果
六、总结
通过这个图论染色问题,加深了我对图论知识的理解。
我明白了如何将理论知识应用到实际问题中来。
虽然我以前也做过类似的地图染色实验,但是在这过程中我发现了自己的一些不足,比如说不够仔细,在构建一个邻接矩阵中多次忘记一些邻接边,以至于邻接矩阵错误。
总之,这次实验加强了我的动手能力以及解决问题的能力,加深了我对图论知识的理解和数据结构的应用能力,总之我收获颇多。