Kruskal算法求最小生成树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
荆楚理工学院
课程设计成果
学院:_______计算机工程学院__________ 班级: 14计算机科学与技术一班
学生姓名: 志杰学号: 2014407020137
设计地点(单位)_____B5101_________ ____________
设计题目:克鲁斯卡尔算法求最小生成树__________________________________
完成日期:2015年1月6日
指导教师评语: ______________ _________________________
___________________________________________________________________________________ ___________________________________________________________________________________________ ___________________________ __________ _
成绩(五级记分制):_____ _ __________
教师签名:__________ _______________
注:介于A和C之间为B级,低于C为D级和E级。按各项指标打分后,总分在90~100为优,80~89为良,70~79为中,60~69为及格,60分以下为不及格。
目录
1 需求分析 (1)
1.1系统目标 (1)
1.2主体功能 (1)
1.3开发环境 (1)
2 概要设计 (1)
2.1功能模块划分 (1)
2.2 系统流程图 (2)
3 详细设计 (3)
3.1 数据结构 (3)
3.2 模块设计 (3)
4测试 (3)
4.1 测试数据 (3)
4.2测试分析 (4)
5总结与体会 (6)
5.1总结: (6)
5.2体会: (6)
参考文献 (7)
附录全部代码 (8)
1 需求分析
1.1系统目标
Kruskal算法是一种按照网中边的权值递增的顺序构造最小生成树的方法。其基本思想是:首先选取全部的n个顶点,将其看成n个连通分量;然后按照网中边的权值由小到大的顺序,不断的选取当前未被选取的边集中权值最小的边。依照生成树的概念,n 个结点的生成树有n-1条边,故反复上述过程,直到选取了n-1条边为止,就构成了一棵最小生成树。
1.2主体功能
在城市规划设计中,假设有n个城市之间建立通信网,则连通n个城市只需n-1条线路。这里自然考虑怎样建立这n-1条路是总费用最省。
把这n个城市抽象成一个连通网,网的顶点表示各个城市,顶点与顶点之间的边表示通信线路,各个城市之间的通讯线路看作边,相应的建设花费作为边的权,这样就构成了一个网络。由于在n个城市之间,可行线路有(n*(n-1))/2条,那么,如果选择其中的n-1条线路(边)在n个城市间建成全都能相互通讯的网,并且总的建设花费为最小?这就是求该网络的最小生成树问题。本程序的目的是要建立一棵生成树使总费用最少。
1.3开发环境
装有Windows 7操作系统的PC机vc++6.0,奔腾4 1.0GHz以上的处理器,编写的程序需要在32MB的存中运行。
推荐在以下基本配置电脑中运行:CPU Intel MMX 233MHz 存:64MB
硬盘空间:1.5GB
显卡:4MB显存以上的PCI、AGP显卡
声卡:最新的PCI声卡
CD-ROM:8x以上CD-ROM
2 概要设计
2.1功能模块划分
运行程序后,程序在存中申请图g的邻接矩阵表示空间,存放作为用整型数组表示的顶点、边、权值的数据。
程序运行过程中调用存放在存放在ESP寄存器中的数据,寄存器中存放着数据、地址和函数传递的中间结果。
Kruskal算法在调用寄存器中的整型数据,对边上的权值进行冒泡排序,将权值小的边放在数组的上面,然后在进行一次循环打印,循环过程中调用vset辅助数组的数据进行比较,两个数据不相等就将该边打印出来,不断进行这个过程直至打印出n-1条边(即
顶点数减一的次数)。具体的功能流程图如下图2.1功能流程图所示。
图2.1 功能流程图
2.2 系统流程图
输入网图的信息后,将网图的边、顶点、边上的权值记录在一个邻接矩阵中,在后面的kruskal算法中直接扫描邻接矩阵,将边的信息存放在算法定义的边集数组中。
图2.2 系统流程图
3详细设计
3.1 数据结构
在Kruskal算法中的数据存放和调用采用整型变量,设置邻接矩阵的最大顶点数,设置图的顶点信息为字符,设置边上权值为整型,定义邻接矩阵图的顶点信息表还有图的顶点数和边数。
Kruskal算法中有一个辅助数组,这里的存放的顶点信息的一维数组vexs的类型是用VertexType类型来表示的,这里把它定义成字符,在实际应用中可以根据需要把它重新定义为其他系统预定义类型或结构类型。此外,邻接矩阵edges的类型用EdgeType 类型表示,这里把它定义为整型。在实际应用中,若权值的类型是其他数据类型,则只需简单修改即可。
3.2 模块设计
1.CreateMGraph创建一个邻接矩阵存储的图。在提示下输入无向图的顶点数和边数,然后再输入各个顶点的信息,也就是顶点的编号,再输入顶点数组编号的下标表示的边和边上的权值,这中间非网图的边的权值为1。
2.Kruskal算法在扫描到邻接矩阵存放的信息后,用冒泡排序将边上的权值从小到大排列。定义一个辅助数组,该数组是用来判断生成树中是否会出现回路,也就是生成正确的最小生成树。判断边的连通分量编号不相等,将这条边打印出来,并将连通分量编号修改。循环顶点数减一次,将最小生成树打印出来。
4测试
4.1 测试数据
主要的测试过程有两个:
1. 对邻接矩阵的输入和存放。克鲁斯卡尔算法运行,得出最小生成树。
2. 克鲁斯卡尔算法对存放的邻接矩阵的调用。输入图的信息后算法得到正确结果。
调试阶段最重要的还是耐性和细心。要有足够的耐性去对待令人烦躁的错误,一步步细心的调试,就会查出错误的所在。我们进行调试、测试是为了让我们的代码、程序更加健壮,质量更高。所以,我们不要畏惧报错,这是个学习进步的过程。
3.调试过程中的输入数据。
第一组测试数据见表4-1。
表4-1 调试数据
权值50 60 40 65 52 45 50 30 42 70 顶点i 1 2 4 3 3 6 4 5 6 5
第二组测试数据: