地图着色 数据结构

合集下载

数据结构与算法概论

数据结构与算法概论

数据结构:图。
2
14 7
3
6
5

绿
1
2
绿3
4蓝
红5
6
绿
7

用最少的颜色染色
概论
19/44
例如
例3:图书馆的书目检索自动化问题
书目卡片
登录号: 书名: 作者名: 分类号: 出版单位: 出版时间: 价格:
概论
20/44
例如
线性的数据结构
书目文件
001 002 003 004 ……
高等数学 理论力学 高等数学 线性代数
• 参考书
–严蔚敏等著 《数据结构》
清华大学出版社
–陈曙辉译《数据结构与算法-C++版》清华大学出版
– 殷人昆 著 《数据结构》清华大学出版社
概论
6/44
上机实验安排
• 共18次(含考试2次)
– 前八周6次上机,后八周12次 – 具体时间另行通知
• 上机考试
– 第1次:每位同学随机抽取前8次上机题目之一,现场 编程演示
逻辑结构(数据结构)
• 相互之间存在一种或多种特定关系的数据元素的集合。 • 元素(结点)类型:
– 基本数据类型:整型、实型、布尔型…… – 复合数据类型:数组、结构体、类
概论
26/44
逻辑结构(数据结构)
• 结点间的关系——结构
–先明确结点,再刻画结点之间的关系 –自顶向下的设计
概论
27/44
概论
15/44
什么是数据结构
用计算机解决一个具体的问题,需要以下几个步骤:
从具体问题抽象出一个适当的数学模型; 设计一个解此数学模型的算法; 编出程序; 进行测试、调整直至得到最终解答。

02地图数据结构

02地图数据结构

L-S
第二章 地 图 数 据 结 构
15
4.属性数据
即描述 属性数据是描述空间实体属性特征的数据,也称非几何数据,
地理现象或地理实体的定性或定量指标,包括
语义与统计数据,如类型、等级、名称、状态
等。有时也把描述时间特征的数据纳入该类。
属性数据中的定性(或定量)指标通常要经编码转换才能被计算机接受。为 了方便计算机存储、管理和使用这些编码,需要研究统一的分类系统和编 码。有关这方面的详细内容将在本书第3章中进行介绍。
根据地理要素的空间分布待征和空间实体分类,可以将地理空间数据分为 点、线、面三种类型。
第二章 地 图 数 据 结 构
10
(1)点类型
点类型可以描述如城乡居民地、工厂、学校、医院、机关、车站、山峰、隘口 等现象。这里,“点”是一个相对的抽象概念,即从较大的空间规模上来观测 这些地物,就能把它们都归结为点状分布的地理现象,因此能用一个点的坐标 (或栅格像元)来描述其空间位置。而如果从较小的空间尺度上来观察这些地理 现象,它们中的多数将可以用一个面状特征来描述。例如同一个城市,在小比 例尺地图上表现为点状分布,而在大比例尺地图上则可表现为面状分布,其内 部表示了十分详细的城市街道分布状况。
坐标对数n:构成该线的坐标对个数;
坐标串:是构成线的矢量坐标对序列,共有n对
标志码 属性码 坐标对数n 坐标串(x1,y1)……
标志码 坐标对数n
+ 坐标串(x1,y1)……
标志码 属性码
第二章 地 图 数 据 结 构
22
③面(多边形)数据结构形式
常见的两种形式
标志码 属性码 坐标对数n 坐标串(x1,y1)…… (x1,y1)
第二章 地 图 数 据 结 构

数据结构课程设计地图着色问题

数据结构课程设计地图着色问题

课程设计报告课程设计题目:地图着色问题专业:xxxxxxxxx班级:xxxxxxxxx姓名:xxxxxxxxx一:需求分析:1)已知中国地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少;2)将各省进行编号,然后利用无向图个顶点之间的边来表示各省的相邻关系;3)演示程序以用户和计算机的对话方式进行;4)最后对结果做出简单分析。

二:概要设计一:设计思路把34个省看成34个顶点,从选定的第一个顶点开始着色,先试第一种颜色,如果这个颜色与这个顶点的其他邻接顶点的颜色不重复,则这个顶点就是用这种颜色,程序开始对下一个顶点着色;如果着色重复,则使用下一种颜色重复上面的操作。

着色过程就是一个递归的过程,直到所有的顶点都处理完后结束着色。

二:数据结构设计因为这个程序是对图的操作,所以程序采用的逻辑结构是图状,存储结构选用邻接表,考虑用邻接表是因为一般的地图的某一个顶点并不会与很多的顶点相邻接,如果用邻接矩阵会浪费很多的存储空间,所以我选择的邻接表来存储。

其中:typedef struct ArcNode{int x; (表示与当前顶点所表示省份相邻的省份的位置信息)struct ArcNode *next; (指向下一个弧结点)}ArcNode; (表示省份之间相邻关系的弧结点)typedef struct{char *name; (顶点所表示的省份的名称)int color; (省份的颜色,用数字表示不同的颜色)ArcNode *firstnext; (指向第一个弧)}shengfen[35];三:详细设计该程序一共包含三个模版:分别为初始化模版、着色模版和输出模版。

1.初始化模块声明表示省份的顶点信息、省份之间相邻关系的弧的信息,并为其赋值。

2.着色模块为各个省份着色。

for(i=1;i<=34;i++){sheng[i].color=0;}for(i=1;i<=34;i++){j=1;p=sheng[i].firstnext;while(p!=NULL){while(p!=NULL&&j!=sheng[p->x].color){p=p->next;}if(p!=NULL)j++;}sheng[i].color=j;}3.输出模块输出各个省份的颜色信息。

1:500、1:1000、1:2000地形图数据结构规程(最新整理)

1:500、1:1000、1:2000地形图数据结构规程(最新整理)

A1.4杭州市1:500、1:1000、1:2000地形图数据数据结构规程杭州市城市规划信息中心广州城市信息研究所有限公司2002年9月目录第1章主要内容与适用范围 (1)第2章引用标准 (1)第3章总则 (1)第4章类型说明与缩写 (2)第5章各层属性表结构 (3)5.1 测量控制点 (3)5.2 控制点注记 (3)5.3 控制点辅助线 (3)5.4 居民地 (3)5.5 线状房屋附属设施 (4)5.6 点状房屋附属设施 (4)5.7 垣栅 (4)5.8 单位名称标记点 (4)5.9 居民地注记 (4)5.10 居民地辅助层 (5)5.11 居民地边线 (5)5.12 线状工矿建筑及附属设施 (5)5.13 点状工矿建筑及附属设施 (5)5.14 场馆设施 (5)5.15 工矿设施注记 (5)5.16 工矿类辅助层 (6)5.17 工矿类边线 (6)5.18 铁路 (6)5.19 线状铁路附属设施 (6)5.20 点状铁路附属设施 (6)5.21 道路中心线 (7)5.23 线状道路附属设施 (7)5.24 点状道路附属设施 (7)5.25 道路注记 (7)5.26 道路辅助线 (8)5.27 各类管线 (8)5.28 线状管线附属设施 (8)5.29 点状管线附属设施 (8)5.30 管线注记 (8)5.31 管线辅助线 (9)5.32 面状水体 (9)5.33 岛屿 (9)5.34 单线河流及沟渠 (9)5.35 线状水系附属设施 (9)5.36 点状水系附属设施 (9)5.37 水体注记 (10)5.38 水系辅助层 (10)5.39 水系及附属设施边线 (10)5.40 境界面 (10)5.41 境界线 (10)5.42 地名标记点 (11)5.43 境界边线 (11)5.44 地名注记 (11)5.45 等高线 (11)5.46 坡、坎 (11)5.47 高程点 (12)5.48 地貌(线状) (12)5.49 地貌(点状) (12)5.50 土质 (12)5.51 地貌与土质注记 (12)5.52 地貌辅助层 (13)5.53 地质地貌边线 (13)5.54 植被(面) (13)5.55 植被(线) (13)5.57 植被注记 (13)5.58 植被边线 (14)5.59 内图廓 (14)5.60 地图图廓整饰线状要素 (14)5.61 地图图廓整饰注记 (14)第1章主要内容与适用范围本规程规定了1:500、1:1000、1:2000地形图数据各层的属性表结构、属性项的中英文名称、数据类型及宽度。

中国地图四色染色问题

中国地图四色染色问题

中国地图四色染色问题LtD中国地图四色染色问题一、问题描述将中国地图用四种不同的颜色红、蓝、绿、黄来染色,要求相邻的省份染色不同,有多少种不同的方案?二、问题分析本文将中国地图的34个省、直辖市、自治区、以及特别行政区转化为图论中的图模型。

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

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

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

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

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

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

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

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

DFS遍历的具体步骤可为下:1)标记图中所有结点为“未访问〞标记。

2)输出起始结点,并标记为“访问〞标记3)起始结点入栈4)假设栈为空,程序结束;假设栈不为空,取栈顶元素,假设该元素存在未被访问的邻接顶点,那么输出一个邻接顶点,并置为“访问〞状态,入栈;否那么,该元素退出栈顶。

3.2 染色问题中的DFS算法设计我们先对任一结点染色,然后用DFS从该结点出发,遍历该图,遍历的下一结点颜色染为与之相邻的结点不同的颜色即可。

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

最后统计染色种数。

染色问题的算法伪代码可以描述如下:color_DFS(当前染色结点):for i in 所有颜色{ while j的已染色邻接点if 结点j相邻接点被染成i颜色标记并breakif 未被标记{当前结点染为i色if 当前结点为最后一个结点endelsecolor_DFS(next)}}3.3 数据结构设计为了实现DFS染色算法,我们需要设计相应的数据结构。

地图着色问题

地图着色问题

一、需求分析1、问题描述现在有一张地图,为了便于区别各个地图上的板块,地图上相邻的颜色块应该是不同的颜色。

现在的任务是给定一张地图,要对其进行着色,相邻的板块之间的颜色不能相同,输出最后的着色的方案。

2、基本分析功能一:为了程序的灵活性,可以让程序自由建立图功能二:为建好的图进行着色。

3、输入输出输入一张图的信息,正确输入边数和顶点数,输入边的关系(两个顶点之间的),颜色只要四种,分别用数字1到4表示。

输出时根据每个顶点不同的标号输出着色的结果。

二、概要设计1、设计思路给定四种颜色,从选定的第一个顶点开始着色,先是第一种颜色,如果这个颜色与这个顶点的其他邻接顶点颜色不重复,则这个顶点可以使用此颜色,程序开始对下一个顶点着色;如果着色重复,则使用下一种颜色重复上述过程。

着色过程就是一个递归的过程,直到所有的顶点都有着色后结束着色过程结束2、数据结构设计:因为这个程序是对图的操作,所以程序采用的逻辑结构是图状,存储结构是邻接矩阵,考虑用邻接表是因为一般的地图的某一个顶点并不会与很多的顶点邻接,如果用邻接矩阵就能符合实际的需求,虽然占用稍大的空间,但是增强了程序的实际使用性。

抽象数据类型定义如下:数据对象是点和边(vex&adj)数据关系是颜色分布以及边的相邻的两个顶点基本操作:CreatGrouph(&G);创建一张需要操作的无向图GDestroy(Graph &G);初始条件:无向图G存在操作结果:销毁图GLocateVex(&G,i)初始条件:无向图G存在操作结果:若在图G中存在顶点i,则返回该顶点在图中的位置,否则返回其他信息Trycolor(current &G,store[])初始条件:无向图G存在,在图中有第current个顶点操作结果:对图开始遍历,并且用他们的序号在store数组的相应位置上存储所染上的颜色。

Print Graph(&G);初始条件:无向图存在操作结果:打印图G中的每个顶点的颜色colorsame(test G)初始条件:无向图G存在,test为图中的一个顶点操作结果:如果图中的test的邻接点的颜色都不与test相同,则返回真,否则返回假。

地图着色代码[新版]

地图着色代码[新版]

地图着色(一)需求和规格说明地图上有不同国家(不同区域),每个国家都与其他一些国家邻接。

现要求对地图着色,使所有的国家和与它邻接的国家有不同的颜色。

通常由四种颜色就已足够。

(二)算法思想回溯算法:试探的方法向最终解逼近,即按某种模式生成一个部分解,然后检查是否合格。

若合格则扩展该部分解向最终解逼近;否则为不合格,无论怎样扩展都不会得到最后解,此时放弃部分解中的结果回溯到先前的部分解,然后重新按照某模式生成另一个部分解,直到获得最终解。

(三)调试与测试以8区域着色为例,各区域邻接情况如下(0表示邻接区域的结束):(四)运行结果:(五)源程序:#include<iostream>using namespace std;const int N=8;//定义一个常整型量N表示区域数量//若要改变所需着色的区域数量只需在此修改N的数值并添加邻接信息//根据习惯以(N+1)*(N+1)的二维数组储存N*N的地图邻接信息intneighbor[N+1][N+1]={{0},{0,2,3,4,5,6,8,0},{0,1,3,4,7,0},{0,1, 2,4,5,6,7,0},{0,1,2,3,6,7,8,0},{0,1,3,6,0},{0,1,3,4,5,8,0},{2,3,4,0},{1,4, 6,0}};//枚举颜色enum colorenum{red=1,blue,green,yellow};//定义结构体Area并增加属性值color表示区域颜色struct Area{colorenum color;};//Area类型数组表示区域编号Area areanum[N+1];//打印地图着色结果void prtmap(){for(int i=1;i<N+1;i++)switch(areanum[i].color){case 1:cout<<"第"<<i<<"区域着"<<"红色"<<endl;break;case 2:cout<<"第"<<i<<"区域着"<<"蓝色"<<endl;break;case 3:cout<<"第"<<i<<"区域着"<<"绿色"<<endl;break;case 4:cout<<"第"<<i<<"区域着"<<"黄色"<<endl;break;}}}//把颜色赋给区域void color_on(int area,int color){areanum[area].color=colorenum(color);}//着色进程void colorarea(int area_to_color)//参数area_to_color为当前要着色的区域编号{int result;for(int color_to_use=red;color_to_use<=yellow;color_to_use++)//neighbor[area_to_color][i]表示与area_to_color区域的第i个邻接区域for(int i=1;neighbor[area_to_color][i]!=0;i++){//与area_to_color邻接的区域已着c色的话不能着色返回0值并跳出循环否则可以着色返回1值if(areanum[neighbor[area_to_color][i]].color==colorenum(color _to_use)/*强制类型转换*/){result=0;break;}else{result=1;}}if(result==1){color_on(area_to_color,color_to_use);if(area_to_color<N)colorarea(++area_to_color);}}//检查区域是否因无色可着而被赋0值若存在该情况则回溯前一区域重新着色if(areanum[area_to_color].color==0){--area_to_color;for(intcolor_to_use=areanum[area_to_color].color+1;color_to_use<=yel low;color_to_use++){for(int j=1;neighbor[area_to_color][j]!=0;j++){if(areanum[neighbor[area_to_color][j]].color==colorenum(color _to_use)){result=0;break;}else{result=1;}}if(result==1){color_on(area_to_color,color_to_use);colorarea(++area_to_color);}}}}int main(){cout<<"地图上有不同国家(不同区域),每个国家都与其他一些国家邻接。

图论课件第七章图的着色

图论课件第七章图的着色
总结词
平面图的着色问题是一个经典的图论问题,其目标是在满足相邻顶点颜色不同 的条件下,使用最少的颜色对平面图的顶点进行着色。
详细描述
平面图的着色问题可以使用欧拉公式和Kuratowski定理进行判断和求解。此外 ,也可以使用贪心算法、分治策略等算法进行求解。
树图的着色问题
总结词
树图的着色问题是一个经典的图论问 题,其目标是使用最少的颜色对树图 的顶点进行着色,使得任意两个相邻 的顶点颜色不同。
分支限界算法
总结词
分支限界算法是一种在搜索树中通过剪枝和 优先搜索来找到最优解的算法。
详细描述
在图的着色问题中,分支限界算法会构建一 个搜索树,每个节点代表一种可能的着色方 案。算法通过优先搜索那些更有可能产生最 优解的节点来加速搜索过程,同时通过剪枝 来排除那些不可能产生最优解的节点。分支 限界算法可以在较短的时间内找到最优解,
尤其适用于大规模图的着色问题。
03
图的着色问题的复 杂度
计算复杂度
确定图着色问题的计算复杂度为NP-完全,意味着该问题在多项式时间 内无法得到确定解,只能通过近似算法或启发式算法来寻找近似最优解 。
图着色问题具有指数时间复杂度,因为对于n个顶点的图,其可能的颜色 组合数量为n^k,其中k为每个顶点可用的颜色数。
02
图的着色算法
贪心算法
总结词
贪心算法是一种在每一步选择中都采取当前状态下最好或最优(即最有利)的选 择,从而希望导致结果是最好或最优的算法。
详细描述
贪心算法在图的着色问题中的应用是通过逐个对顶点进行着色,每次选择当前未 被着色的顶点中颜色数最少的颜色进行着色,直到所有顶点都被着色为止。这种 算法可以保证最小化使用的颜色数量,但并不保证得到最优解。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三、详细设计:
1)主要功能模块的算法思想及其步骤
着色模块:
int colorsame(int s,Graph G)//判断这个颜色能不能满足要求
{
int i,flag=0;
for(i=1;i<=s-1;i++)//分别与前面已经着色的几块比较
if(G.arcs[i][s]==1&&color[i]==color[s])
#include <stdlib.h>
#define MAXedg 100
#define MAX 0
#define N 4 //着色的颜色数
int color[30]={0};//来存储对应块的对应颜色
typedef char vextype;
typedef int adjtype;
typedef struct //定义图
二、概要设计:
1)数据结构的设计
typedef struct //定义图
{
vextype vexs[MAXedg]; //存放边的矩阵
adjtype arcs[MAXedg][MAXedg]; //图的邻接矩阵
int vnum,arcnum; //图的顶点数和边数
}Graph;
2)功能模块的划分及模块间调用关系
int colorsame(int s,Graph G)//判断这个颜色能不能满足要求
{
int i,flag=0;
for(i=1;i<=s-1;i++)//分别与前面已经着色的几块比较
if(G.arcs[i][s]==1&&color[i]==color[s])
{
flag=1;break;
}
return flag;
顶点为:a b c d e f
相邻边:a-b b-c b-e b-f c-d c-e c-f e-f
{
vextype vexs[MAXedg]; //存放边的矩阵
adjtype arcs[MAXedg][MAXedg]; //图的邻接矩阵
int vnum,arcnum; //图的顶点数和边数
}Graph;
//***********************************************************
exit(1);
}
else
{
for(i=1;i<=N;i++)//对每一种色彩逐个测试
{
color[s]=i;
if(colorsame(s,G)==0)
trycolor(s+1,G);//进行下一块的着色
}
}
}
//*****************************************************************
int LocateVex(Graph G,char u)
{
int i;
for(i=1;i<=G.vnum;i++)
{
if(u==G.vexs[i])
return i;
}
if(i==G.vnum)
{
printf("Error u!\n");
exit(1);
}
return 0;
}
//**********************************************************
{
scanf("%c",&G.vexs[i]);
getchar();
}
for(i=0;i<=G.vnum;i++)
for(j=0;j<=G.vnum;j++)
G.arcs[i][j]=MAX;
printf("输入边的两个顶点和权值(均用1表示):\n");
for(k=0;k<G.arcnum;k++)
}
//******************************************************************
void output(Graph G)//输出函数
{
int ;
for(i=1;i<=G.vnum;i++)
printf("%d ",color[i]);
printf("\n");
{
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;
}
}
{
int i;
if(s>G.vnum)//递归出口
{
output(G);
exit(1);
}
else
{
for(i=1;i<=N;i++)//对每一种色彩逐个测试
{
color[s]=i;
if(colorsame(s,G)==0)
trycolor(s+1,G);//进行下一块的着色
}
}
}
2)源程序清单
#include <stdio.h>
int main()
{
Graph G;
CreateGraph(G);
PrintGraph(G);
printf("着色方案:\n");
trycolor(1,G);
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<=G.vnum;i++)
printf("\n");
printf("图的邻接矩阵:\n");
for(i=1;i<=G.vnum;i++)
{
for(j=1;j<=G.vnum;j++)
printf("%d ",G.arcs[i][j]);
printf("\n");
}
}
//******************************************************************
}
//******************************************************************
void trycolor(int s,Graph G)//s为开始图色的顶点,本算法从1开始
{
int i;
if(s>G.vnum)//递归出口
{
output(G);
数据结构课程设计
班级:
学号:
姓名:
姓名:
班级:
学号:
题目:地图着色
一、需求分析:
1.已知中国地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少;
2.将各省进行编号,然后利用无向图个顶点之间的边来表示各省的相邻关系;
3.演示程序以用户和计算机的对话方式进行;
4.最后对结果做出简单分析。
{
flag=1;break;
}
return flag;
void output(Graph G)//输出函数
{
int i;
for(i=1;i<=G.vnum;i++)
printf("%d ",color[i]);
printf("\n");
}
void trycolor(int s,Graph G)//s为开始图色的顶点
//****************************************************************
void PrintGraph(Graph G) //输出图的信息
{
int i,j;
printf("图的各顶点:\n");
for(i=1;i<=G.vnum;i++)
printf("%c ",G.vexs[i]);
相关文档
最新文档