连通图着色问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
沈阳航空航天大学
课程设计报告
课程设计名称:软件综合课程设计课程设计题目:连通图着色问题
院(系):计算机学院
专业:计算机科学与技术
班级:7401104
学号:200704011110
姓名:武林
指导教师:刘香芹
沈阳航空航天大学课程设计报告
目录
1 需求分析 (2)
1.1题目的内容与要求 (2)
1.11题目的内容 (2)
1.12题目的要求 (2)
1.2题目理解与程序解读 (2)
2 总体设计 (4)
2.1数据结构设计 (4)
2.2数据结构类型与函数 (4)
3 详细设计 (6)
3.1子函数流程图 (6)
3..1.1 memset_子函数 (6)
3..1.2sort子函数 (7)
3..1.3 brush_sort子函数 (8)
3.2主程序流程图 (9)
4 调试分析 (10)
4.1调试时遇到的问题 (10)
4.2解决方案 (10)
4.3调试结果及说明 (11)
参考文献 (12)
源程序(清单) (13)
1 需求分析
1.1题目的内容与要求
1.11题目的内容
输入一个无向图到适当的存储结构中,给图上的每一个结点标记一种颜色,在保证任何相邻结点颜色不同的同时,求解出该图所需要的最少颜色数,并给出每个结点的具体颜色。
1.12题目的要求
1)完成系统需求分析;
2)开发工具可以选择C语言或面向对象的C++等;
3)界面友好,操作方便;
4)按照课程设计规范书写课程设计报告。
1.2题目理解与程序解读
本次课设与离散数学当中图的部分有密切的联系,连通图的着色问题,涉及到图的连通性和图的着色问题。当图的结点之间存在通路,则此图是连通的,在此基础之上对他进行着色。
重要之处在于每个进店标记一种颜色,但要求的是相邻的结点要着上不同的颜色,要求所使用的颜色数最少即是所要求的。
解决此题的算法是韦尔奇.鲍威尔的着色理论,算法如下:
(1)将图的结点按照度数的递减顺序进行排列,(这种排列可能不是唯一的,因为有些点有相同的度数)。
(2)用第一种颜色对第一个结点进行着色,并且按排列次序,对于前面着色点不相邻的每一个结点着上同样的颜色。
(3)用第二种颜色对尚未着色的点重复第二个步骤,用第三种颜色继续这种
做法,直到所有的点全部着上色为止。
所以源程序就是对韦尔奇鲍威尔算法演示。首先输入结点个数和边的个数,结点结构体内包含结点编号,度数,结点的颜色和状态。边的结构体当中包含结点结构体变量,用来指示边起始节点和终止结点,同时还包含边的编号。
对输入的图用关联矩阵来表示,对着色的颜色用整型的数字来表示,所以我们规定数字1—5分别表示为红色,黄色,蓝色,绿色和黑色。
初始化颜色为红色,即是为数字1.颜色个数变量初始化为0个。
2 总体设计
2.1数据结构设计
结点和边分别用结构体来存储,结点的结构体为:
typedef struct Node//结点
{
int v;
int deg;
int color;
bool flag;
}Node;
其中v标示结点的编号,deg标示每个结点的度数,color标示对每个结点着上的颜色,flag标示此时结点的状态。这里我们申请最多可以输入50个结点的空间,Node[50]。
边的结构体为:
typedef struct Edge
{
int e0;
Node e1;
Node e2;
}Edge;
这里e0标示边的编号,e1和e2则代表边的起始节点和终止结点。这里我们也申请了最多50条边的空间,Edge[50]。对每个结点的度数进行排序,呈递减顺序,将结点的编号按排好的顺序存放到数组downnote[m]中,这里的m表示输入结点个数的变量。从数组downnote[m]中的第一个元素开始,根据韦尔奇鲍威尔算法对图进行着色,最后确定着色的个数。
2.2数据结构类型与函数
函数名称函数原型功能描述
main void main(void); 系统主程序
inite void inite(int m,int n); 初始化无相连通图
memset_ void memset_(int m,int n);求出关联矩阵以及各点的度数sort void sort(int m,int n); 对度数进行排序
brush_color void brush_color(int m,int n); 进行着色
表2.1 函数列表
3 详细设计
3.1 子函数流程图
3..1.1 memset_子函数
此部分为求关联矩阵表示,以及求出每个结点相应的度数。 开始初始化关联矩阵数组
从第一个结点开始寻找相邻结点
对所有边循环寻找
如果此结点的编号与边的起始节点或终止结点相同
关联矩阵数组相应位置置
1,并且此结点的度数加1
判断下一条边
是否为最后一条边
判断下一个结点
是否为最后一个结点
显示关联矩阵数组,各点的度数
结束N Y
Y
Y
N
N
图3.1 memset_函数