C语言地图着色

合集下载

贪心法给中国地图上色

贪心法给中国地图上色
if((i+1)%3==0)
cout<<endl;
}
cout<<endl;
fin.close();
}
int Graph::IsEdge(int v1,int v2)
{
if(Edge[v1][v2]>0)
return 1;
else return 0;
}
void Coloring ();//产生图的着色方案
};
/*************************Graph.cpp*****************/
int Graph::check(string a)
{
for(int i=0;i<n;i++)
if(vex[i]==a)
color=newcolor;
}
/*****************************color_greedy.cpp********************/
color_greedy::color_greedy(int n0,int m0,int e0):g(n0,e0)
{
n=n0;
/*******************************subset.cpp***********************/
subset::subset(int newcolor,int m)
{
n=m;
if(n>0)
newclr=new int[n];
else
newclr=0;
for(int i=0;i<n;i++)//找图中第一个未着色的结点v

图的着色问题--C++实现(含详细注释)

图的着色问题--C++实现(含详细注释)

图的着色问题一、题目简述(1) 图的m-着色判定问题给定一个无向连通图 G 和 m 种不同的颜色。

用这些颜色为图 G 的各顶点着色,每个顶点着一种颜色,是否有一种着色法使 G 中任意相邻的两个顶点着不同颜色?(2) 图的m-着色优化问题若一个图最少需要 m 种颜色才能使图中任意相邻的两个顶点着不同颜色,则称这个数 m 为该图的色数。

求一个图的最小色数 m 的问题称为m-着色优化问题。

二、算法思想1. m-着色判定问题总体思想:通过回溯的方法,不断为每一个节点着色,每个点的颜色由一个数字代表,初始值为1。

在对前面 step - 1 个节点都合法的着色之后,开始对第 step 个节点进行着色。

如果 n 个点均合法,且颜色数没有达到 m 种,则代表存在一种着色法使 G中任意相邻的两个顶点着不同颜色。

具体步骤:1. 对每个点 step ,有 m 种着色可能性,初始颜色值为1。

2. 检查第 step 个节点颜色的可行性,若与某个已着色的点相连且颜色相同,则不选择这种着色方案,并让颜色值加1,继续检查该点下一种颜色的可行性。

3. 如果第 step 点颜色值小于等于 m ,且未到达最后一个点,则进行对第 step + 1 点的判断。

4. 如果第 step 点颜色值大于 m ,代表该点找不到合适的分配方法。

此时算法进行回溯,首先令第 step 节点的颜色值为0,并对第 step - 1 个点的颜色值+1后重新判断。

5. 如果找到一种颜色使得第 step 个节点能够着色,说明 m 种颜色的方案是可行的。

6. 重复步骤2至5,如果最终 step 为0则代表无解。

2. m-着色优化问题基于问题1,对于一个无向图 G ,从1开始枚举染色数,上限为顶点数,第一个满足条件的颜色数即为所求解。

三、实现过程(附代码)1. m-着色判定问题#include<iostream>using namespace std;int color[100]; // 每个点的颜色int mp[100][100]; // 图的邻接矩阵int n, m, x; // n顶点,m种颜色方案,x条边bool check(int step) {// 判断与step点相邻的点,颜色是否与step点相同,若相同则返回falsefor (int i=1; i<=n; i++) {if (mp[step][i] ==1&&color[i] ==color[step]) {return false;}}return true;}bool Solve(int m) {// 求解是否可以找到一种可行的染色方案int step=1; // step指示当前节点while (step>=1) {color[step] +=1; // 假定颜色值从1开始,若为回溯,选择下一种方案while (color[step] <=m) { // 按照问题条件选择第step点颜色if (check(step)) {break;} else {color[step]++; // 搜索下一个颜色}}if (color[step] <=m&&step==n) { // 如果找完n个点,且染色方法小于等于m种 return true;} else if (color[step] <=m&&step<n) {step++; // 求解下一个顶点} else { // 如果染色数大于m个,回溯color[step] =0; // 回溯,该点找不到合适的分配方法,对上一点进行分析step--;}}// 如果step退到0,则代表无解return false;}int main() {int i, j;bool ans=false;cout<<"输入顶点数n和着色数m"<<endl;cin>>n>>m;cout<<"输入边数"<<endl;cin>>x;cout<<"具体输入每条边"<<endl;for (int p=0; p<x; p++) { // 以无向邻接矩阵存储边cin>>i>>j;mp[i][j] =1;mp[j][i] =1;}if (Solve(m)) {cout<<"有解";} else {cout<<"无解";}return0;}2. m-着色优化问题#include<iostream>using namespace std;int color[100]; // 每个点的颜色int mp[100][100]; // 图的邻接矩阵int n, m, x; // n顶点,m种颜色方案,x条边bool check(int step) {// 判断与step点相邻的点,颜色是否与step点相同,若相同则返回falsefor (int i=1; i<=n; i++) {if (mp[step][i] ==1&&color[i] ==color[step]) {return false;}}return true;}bool Solve(int m) {// 求解是否可以找到一种可行的染色方案int step=1; // step指示当前节点while (step>=1) {color[step] +=1; // 假定颜色值从1开始,若为回溯,选择下一种方案while (color[step] <=m) { // 按照问题条件选择第step点颜色if (check(step)) {break;} else {color[step]++; // 搜索下一个颜色}}if (color[step] <=m&&step==n) { // 如果找完n个点,且染色方法小于等于m种 return true;} else if (color[step] <=m&&step<n) {step++; // 求解下一个顶点} else { // 如果染色数大于m个,回溯color[step] =0; // 回溯,该点找不到合适的分配方法,对上一点进行分析step--;}}// 如果step退到0,则代表无解return false;}int main() {int i, j;bool ans=false;cout<<"输入顶点数n"<<endl;cin>>n;cout<<"输入边数"<<endl;cin>>x;cout<<"具体输入每条边"<<endl;for (int p=0; p<x; p++) { // 以无向图邻接矩阵存储边 cin>>i>>j;mp[i][j] =1;mp[j][i] =1;}for (m=1; m<=n; m++) { // 从小到大枚举着色数mif (Solve(m)) { // 如果有解,输出答案并跳出循环cout<<"最小色数m为 "<<m;break;}}return0;}四、结果及分析问题1测试用例:问题2测试用例:经检验,最少着色数的范围为2-4,意味着使 G 中任意相邻的两个顶点着不同颜色最多需要4种颜色。

c语言 四色问题 邻接矩阵

c语言 四色问题 邻接矩阵

c语言四色问题邻接矩阵四色问题是指在平面图上,如何用四种颜色对图中的各个区域进行着色,使得相邻的区域颜色不能相同。

邻接矩阵是用矩阵表示图中顶点之间的连接关系的一种方式。

下面是C语言实现使用邻接矩阵解决四色问题的代码:c#include <stdio.h>#include <stdlib.h>#define MAX_VERTICES 50int adjacent[MAX_VERTICES][MAX_VERTICES];int n;void init_adjacency_matrix() {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {adjacent[i][j] = 0;}}void add_edge(int i, int j) {adjacent[i][j] = 1;adjacent[j][i] = 1;}int get_color(int solution[], int vertex) {for (int color = 1; color <= 4; color++) {int conflict = 0;for (int i = 0; i < n; i++) {if (adjacent[vertex][i] && solution[i] == color) {conflict = 1; color conflictbreak;}}if (!conflict) {return color;}}return -1; no valid color}int is_solution_valid(int solution[]) {for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if (adjacent[i][j] && solution[i] == solution[j]) {return 0; color conflict}}}return 1; solution is valid}void print_solution(int solution[]) {printf("Solution: ");for (int i = 0; i < n; i++) {printf("%d ", solution[i]);}printf("\n");}void backtrack(int solution[], int vertex) {if (vertex == n) {if (is_solution_valid(solution)) {print_solution(solution);exit(0);}return;}for (int color = 1; color <= 4; color++) {solution[vertex] = color;backtrack(solution, vertex + 1);solution[vertex] = 0;}}int main() {n = 7;init_adjacency_matrix();add_edge(0, 1); add_edge(0, 2); add_edge(1, 2);add_edge(1, 3); add_edge(2, 4); add_edge(3, 4);add_edge(3, 5); add_edge(4, 6); add_edge(5, 6);int solution[MAX_VERTICES] = {0};backtrack(solution, 0);printf("No solution found.\n");return 0;}其中,`adjacent`是邻接矩阵,`n`是顶点的个数,`init_adjacency_matrix()`用于初始化邻接矩阵,`add_edge()`用于添加边,`get_color()`用于获取某个顶点的可用颜色,`is_solution_valid()`用于判断当前解是否合法,`print_solution()`用于打印解,`backtrack()`是回溯函数,`main()`函数中定义了一个简单的图并调用回溯函数求解。

中国地图四色染色问题

中国地图四色染色问题

中国地图四色染色问题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染色算法,我们需要设计相应的数据结构。

地图着色问题

地图着色问题

地图着色问题说明:任何平面区域图都可以用四种颜色着色,使相邻区域颜色互异。

这就是四色定理。

要求给定区域图排出全部可能的四着色方案。

区域相邻关系用矩阵表示,每个区域又一个序号,(从0七连续排列)adj【i】【j勘硎厩 騣,j相邻。

数组cilir记录每个区域上着的色,用1.2.3.4表示。

程序应包括四个函数:coloring对所给邻接矩阵找着全部着色方案色乐的:对区域i在指定的颜色范围内选出可选颜色或报告失败(失败返回-1)辞令次日卡:判断对区域i在指定的颜色c是否可用八寸卡:选色失败时或完成一种着色方案时进行回溯另外可定义output函数,每次输出一种着色方案/*递归算法:void Coloring(区域 n)1. 令颜色集ClrSet={ 没有被区域n的邻居区域使用的颜色 }.2. 如果ClrSet是空集,返回.3. 对ClrSet中的每种颜色c,作循环:3.1 为区域n着色c。

3.2 如果所有区域都已着色(n是最后一个区域),那么显示/保存着色结果.3.3 否则对下一个尚未着色的区域(n+1),调用Coloring(n+1).4. 把区域n变为没有着色的区域.--------------------------------------------------------*/template<int node_count = 8>class CColoring{private:typedef int node_type;typedef int color_type;typedef std::set<node_type> node_set;typedef std::vector<color_type> color_array;public:void operator()(const int _Matrix[node_count][node_count]){matrix = _Matrix;colors_of_nodes.resize(node_count, 0); total_count = 0;coloring(0);}private:void coloring(node_type n){// 颜色的使用情况std::vector<bool> used_colors;node_type m;color_type c;// 初始化颜色的使用情况used_colors.resize(color_count, false);// 遍历每个与区域n相邻的区域mfor(m = 0; m < node_count; ++m){if(matrix[n][m]){// 获取m的颜色c = colors_of_nodes[m];// m已着色if(c != 0)used_colors[c] = true;}}// 遍历每个未被n的邻居使用的颜色cfor(c = 1; c < color_count; ++c){if(!used_colors[c]){// 为n着色ccolors_of_nodes[n] = c;// 着色完毕if(n >= node_count - 1)++total_count;// 输出结果_tprintf(_T("---------------------\n"));_tprintf(_T("Method %d:\n"), total_count);for(m = 0; m < node_count; ++m){_tprintf(_T("node: %d, color: %d\n"), m, colors_of_nodes[m]); }}// 还有区域没有着色else{// 为下一个未着色的区域,调用coloring()coloring(n + 1);}}}// 将n设置为没有着色的区域colors_of_nodes[n] = 0;}// 0表示无色,1-4表示4种不同颜色static const int color_count = 5;// 邻接矩阵const int (* matrix)[node_count];// 各区域对应的颜色color_array colors_of_nodes;// 总的着色方案数int total_count;};void main(){int Matrix[4][4] ={{ 0, 1, 0, 0 },{ 1, 0, 0, 0 },{ 0, 0, 0, 1 },{ 0, 0, 1, 0 },};CColoring<4> coloring;coloring(Matrix);}/*递归算法:void Coloring(区域 n)1. 令颜色集ClrSet={ 没有被区域n的邻居区域使用的颜色 }.2. 如果ClrSet是空集,返回.3. 对ClrSet中的每种颜色c,作循环:3.1 为区域n着色c。

基于C语言的GIS地图着色问题的实现

基于C语言的GIS地图着色问题的实现
#define N 9 / / 地图的城市区域数 void ColorUpMap( int CityColorUpMetro[N][N],int r_CityColorUpArry[N],int SumCityN,int CurrentCityPosition) / /参数说明: CityColorUp[N][N]地图城市的相互关系矩 阵; r_CityColorUp[N]: 城市所要上的色数组,最多为每一城市 上不同和类的色,共有 N 种,SumCityN: 城市总数; CurrentCityPosition: 当前城市的位置 { int i;
* 收稿日期: 2012—05—03 作者简介: 郭仁安( 1983—) ,男,助理工程师,主要从事工程测量,GIS 应用研究等工作。
122
城市勘测
2012 年 12 月
一个点,并给每个城市编号,相邻的城市之间用直线连 接。据此做出邻接矩阵,若第 i 个城市与第 j 个城市相 邻,则 metro[i][j]= 1,否则 metro[i][j]= 0,照编号 从小到大的顺序检查每个城市,对每个城市从 1 到 4 使用 4 种颜色着色,若当前颜色可用( 即不与相邻城市 颜色相同) ,则着色; 否则测试下一种颜色。
2 地图着色问题的数据模型
在地图中两个城市之间只可能存在着两种关系相 离和相交关系。因此在计算机中可用 0、1 表示这两种 关系,用 0、1 分别来表示两城市之间的相离和相邻( 相
邻是指两城市之间有公共的边界) ,并人为规定相同的 城市与城市之间的关系是 0。由于一幅图中城市太 多,为使问题简化,现就用如下 9 个区域( 设每个区域 所代表不同的城市) 来进行模拟,如图 1 所示。用 0、1 将两者的关系由矩阵加以表示,如图 2 所示,不难看出 它们两两之间的关系是邻接对称矩阵。

中国地图着色源代码

中国地图着色源代码
{0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//14
{0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//15
{0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0},//8
{0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0},//9
{0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0},//28
{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0},//29
#include <iostream>
#include <string>
#include <time.h>
using namespace std;
#define MaxSize 34
#define N 4
int color[10]={0};
string name[34]={"广西","广东","云南","贵州","湖南","江西","福建",
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},//30

中国地图四色染色问题

中国地图四色染色问题

中国地图四色染色问题一、问题描述将中国地图用四种不同的颜色红、蓝、绿、黄来染色,要求相邻的省份染色不同,有多少种不同的方案?二、问题分析本文将中国地图的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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计地图着色课程设计名称:课程设计专业班级:学生姓名:学号:指导教师:课程设计时间:计算机专业课程设计任务书目录1 需求分析 (4)2 概要设计 (4)3详细设计 (5)4 运行环境 (6)5开发环境 (6)6 程序设计.............................................................................................6~97 调试分析........................................................................................9~108 测试结果 (10)9参考文献 (11)10心得体会 (11)11成绩评价表 (12)a) 1需求分析A 已知中国地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少;B 将各省进行编号,然后利用无向图个顶点之间的边来表示各省的相邻关系;C 演示程序以用户和计算机的对话方式进行;D 最后对结果做出简单分析。

b ) 2概要设计:i 画程序整体结构图ii 分配函数功能功能模块的划分及模块间调用关系typedef struct //定义图{vextype vexs[MAXedg]; //存放边的矩阵adjtype arcs[MAXedg][MAXedg]; //图的邻接矩阵int vnum,arcnum; //图的顶点数和边数}Graph;C) 3详细设计i ) 主要功能模块的算法思想及其步骤着色模块: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;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为开始图色的顶点{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);//进行下一块的着色}}}d) 4 运行环境i 软件环境操作系统:Windows8ii 硬件环境处理器:Intel Pentium 166MX内存:32MB硬盘空间:1GB显卡:SVGAE) 5 开发环境I 编程环境:Dev-C++ 5.0 beta 9.2 (4.9.9.2)Ii 编程语言:C语言,ANSI C89。

f) 6 程序设计#include <stdio.h>#include <stdlib.h>#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<=G.vnum;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<=G.vnum;i++){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++){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<=G.vnum;i++)printf("%c ",G.vexs[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");}}//****************************************************************** 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;}//****************************************************************** 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为开始图色的顶点,本算法从1开始{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);//进行下一块的着色}}}//*****************************************************************int main(){Graph G;CreateGraph(G);PrintGraph(G);printf("着色方案:\n");trycolor(1,G);return 0;}G) 7 调试分析1.测试中的问题举例:在测试删除联系人函数时发现无论通讯录中现存多少条记录只要删除一条之后,通讯录就会被清空,经过检查发现是删除函数中的条件控制设置有错,导致只要一删除一个联系人就会事头结点与尾结点指向同一个,导致再显示联系人时显示无联系人。

经过调整已处理好。

2.算法改进设想举例:程序中还有很多地方不能很好的模拟通讯录的功能,比如在增肌联系人时,不管原来新联系人姓名是否已存在,都会被加入通讯录,这样一来就有可能重复记录。

此外在查找联系人时只要查找到一个合法记录就会中断查找操作,如此有可能导致记录的漏查。

结合以上两点应优化增加查找联系人算法,在存入之间进行防重判断。

H) 8 测试结果由于地图上各省连接关系太多,所以这里只给出简单的测试数据,来测试该程序的功能,如下:给出如下示意图,省份抽象为点,接壤抽象为有边相连。

顶点为:a b c d e f相邻边:a-b b-c b-e b-f c-d c-e c-f e-fI )参考文献[1]严蔚敏,《数据结构(C语言版)》清华大学出版社[2]谭浩强.《C语言程序设计》(第三版)清华大学出版社J )心得体会通过这次数据结构的课程设计,我更进一步的了解到了C语言对编程的基础性,与数据结构思想对于一个程序编码顺利进行的重要性。

c语言是程序的骨架,而数据结构和算法便是程序的思想,要成功的编写程序必须选择好合适的数据结构。

除此之外,我觉得比较重要的一点是在编复杂程序时要有宏观思想,要从整体把握设计好各个板块的调用关系,最好先做出一个流程图,再按照这个总体设想进一步具体、细化!这样才不会在需要调用其它函数时手忙脚乱!信息科学与工程学院课程设计成绩评价表课程名称:数据结构课程设计设计题目:地图着色专业:班级:姓名:学号:。

相关文档
最新文档