代码下载链接:(41条消息) 可视化最小生成树Kruskal,DEV配EGE-C文档类资源-CSDN文库

代码下载链接:(41条消息) 可视化最小生成树Prim,DEV配EGE-C文档类资源-CSDN文库

摘  要:最小生成树问题在生活应用中存在诸多实例,多用于光纤铺设,管道铺设等。本次项目以为东校区铺设管线系统为实例,设计一个辅助程序。将地图抽象为无向图,用邻接矩阵的形式存储在文本中,将铺设最小成本管线抽象为求最小生成树的问题,通过C语言使用Prim和Kuaskal算法实现,求得最小生成树后,绘制简单的示意图并将结果格式化输出最小生成树的各个边及边权。

关键词:Prim;Kruskal;文本

1 项目分析

项目要求开发一个管线铺设辅助系统,使其成本达到最小,是一个在现实中非常重要的问题。这一类的问题在现实中应用性广泛,各种线路的架设,道路的修建等,都使它有重要的现实经济意义。管线铺设系统具体以我校东校区为例,在东校区大学生活动中心、学生公寓1-7舍、雁鸣湖食堂、世纪楼、第一、三、四教学楼、图书馆、机械馆之间铺设输水管道,设计算法并实现使铺设的输水管道距离最短。

如何以最低的成本建设这个铺设网的问题转化成数学描述就是求最小生成树的问题,可以使用Prim算法或者Kruskal 算法,两者都是求解最小生成树的典型算法。系统具备从文本读取数据、显示最佳铺设方案,以及绘制最佳方案的简单示意图等功能。

2项目总体设计

项目使用DEVC++搭配EGE图形库作为开发环境,以C语言为技术语言。针对项目需求的实现,将项目主体分为读取文件(创建图),输出文本,绘制结果图,主要算法(Prim、Kruskal)几个模块来实现。

3 各功能模块的设计和开发

3.1 文件的输入输出

使用头文件<stdio.h> 中自带的读取文件函数fopen,fopen函数通常有三个参数,文件指针,文件地址,使用方式。通常将fopen函数的返回值赋给一个指向文件的指针变量(即文件信息区的起始地址),为文件建立相应的信息区和文件缓冲区。使用方式为a+,即以追加、可读写的方式打开文件,允许读写。若进行读操作,则从头开始读;若进行写操作,则将内容添加在末尾。若文件不存在,则创建文件。用fprintf和fscanf函数向文件进行格式化的输入输出。

Prim和Kruskal的读取文件操作稍有不同,Prim实际用二维数组存储的是邻接矩阵,Kruskal则是用一维数组存储边的两点,权值,只需要扫描上矩阵即可。

Prim算法使用的创建图的函数如下

Kruskal算法使用的创建图的函数如下,这里所需要注意的点是第二层循环中j不能等于i+1,因为文件中指针是一个个读的,不能跳跃。

输出至文本中的函数没有基本没有区别,但Prim函数需要注意不能使用辅助数组的lowcost,因为在构建树的过程中,为标记点,lowcost现在等于0,只能用查询邻接矩阵的形式获取权值

主要在最后需要关闭文件,关闭文件的目的是防止结束程序时数据丢失。因为向文件写数据时,是先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件,当数据未充满缓冲区时程序结束运行,有可能使缓冲区的数据丢失。

本次项目已知图的点数,扫描文件的矩阵是n*n的,无需判断是否文本结束。在实际判断文件空时,也可以用feof函数或者EOF。feof是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0。文档的结尾都有一个隐藏字符”EOF”,当程序读取它的时候,就会知道文件已经到达结尾。

3.2 prim算法

Prim算法基于贪心的思想,以选择点为基础,始终保持边集构成一棵生成树。

算法步骤:
(1)先建立一个只有一个结点的树,这个结点可以是原图中任意的一个结点。

(2)使用一条边扩展这个树,要求这条边一个顶点在部分生成树中另一个顶点不在部分生成树中,并且这条边的权值要求最小。

(3)重复步骤(2)直到所有顶点都在树中。

在计算机实现的核心在于,找到未并入的顶点与已生成的部分生成树结点的最小权值,可以设置closeEdge作为辅助数组,记录上述信息。

在Prim实际实现中,辅助数组包括新顶点,与该顶点的最小权值。初始时,closeEdge数组存储的是与起始点相连接的点和边。接下来查找辅助数组中的最小权值的边,标记新进入部分生成树的顶点,将新顶点与某点的边与原辅助数组的内容进行比较,更新辅助数组的内容。如此反复,直到所有点都检测过。显然,Prim算法的时间复杂度与点有关,O(n^2)。

图1 Prim函数简化流程

3.3 Kruskal算法

Kruskal基于贪心的思想,以选择边为基础。算法步骤为:

(1) 将边按照边权从小到大排序

(2) 选出一条边权最小的边。

(3)如果这条边两个顶点至少有一个未被选中过,那么将它加入最小生成树, 相同就跳过。

(4)重复(2)和(3)直到所有的边都扫描过为止(直到选取了n-1条边为止)。

在计算机的实际实现中有两个需要思考的点,即:

(1)如何判断这条边的两个顶点是否选中过。

(2)如何标记两点加入最小生成树中。

那么就可以把问题转换为判断两个端点是否在同一个集合中,这正好与并查集的特性相契合。并查集可以通过查询两个结点所在集合的根结点判断是否来自同一集合。

在实际实现中,对于图存储其边表,包括构成边的两点,边的权值。在Kruskal中首先调用sort函数对边数组进行排序。定义并查集,初始状态下,每个点都是一个集合,是集合的父节点。Set[]=0是父节点的标志,初始化计数器,对每次选择的边的两点求其所在的连通集,判断父节点是否相等,若不相等就意味这这两点还未完全并入到最小生成树中,将其并入到其中。如此反复,直到所有的边都检测完,或者检测到n-1条边。

显然最坏情况下,对于完全图来说,检测到n-1条符合条的边来停止循环的方法所用时间更小,但Kruskal的时间复杂度并不与n成比例,Kruskal 算法的时间复杂度主要依赖于对于边的排序,若使用快排便能够在O(eloge) 的时间内得到一个最小生成树的算法。

3.4 绘图实现

在本次项目中使用EGE作为图形库,像我们所熟知的2048小游戏就可以用EGE来实现。EGE图形库比较小型,功能基础,只需要一些C语言的基础就可以使用EGE图形库。在绘图函数中首先初始化一些绘图参数,显示窗口背景图片,使用xyprintf(),在窗口指定位置输出字符串。需要注意的是,窗口坐标的坐标系的显示。

图3 窗口坐标图

在输出边的权值时,因为xyprintf()只能在指定位置输出字符串,这里利用了标准库函数 itoa(),将整型值转换为字符串。

点和图片的显示较为简单,这里只给出画线的函数。kuaskal和Prim的数据结构的存储不一致,所以绘图函数也有一些差别,但基础的操作是一致的。

4 举例分析

例题[1],分别用Prim和Kruskal算法求解如下连通图的最小生成树,给出过程。

(1)Prim算法实现

i

1

2

3

4

5

U

V-U

K

adjvex

lowcost

V1

6

V1

1

V1

5

{v1}

{v2,v3,v4,v5,v6}

2

adjvex

lowcost

V3

5

0

V1

5

V3

6

V3

4

{v1,v3}

{v2,v4,v5,v6}

5

adjvex

lowcost

V3

5

0

V6

2

V3

6

0

{v1,v3,v6}

{v2,v4,v5}

3

adjvex

lowcost

V3

5

0

0

V3

6

0

{v1,v3,v6,}

{v2,v5}

1

adjvex

lowcost

0

0

0

V2

3

0

{v1,v3,v6,v4,v2}

{v5}

4

adjvex

lowcost

0

0

0

0

0

{v1,v3,v6,v4,v2,v5}

{}

(2)Kuaskal算法实现

第i次

(Vi, Vj)min

W min

V

1

(V1, V3)

1

(V1, V3)

2

(V4, V6)

2

(V1, V3,V4,V6)

3

(V3, V6)

3

(V1, V3,V4,V6,V2,V5)

4

(V3, V2)

4

(V1, V3,V4,V6,V2,V5)

5

(V3, V2)

5

(V1, V3,V6,V4,V2,V5)

5运行调试结果

(1)指定的文本输入test.txt

(2)Kuaskal运行结果

 

(3)Prim运行结果

(4)界面输出实现

6 项目总结

输水管道铺设路线方案的目标实际上是多元的,同时受到很多约束条件的限制,但考虑到制定方案时,所选择的目标值要符合易计算、实用性较强等特点,因此尽可能地选择单一化的目标值,即必须在满足约束条件限制下实现成本最低,或路线最短,或消耗最小等目标。本文深入分析最小生成树算法的优点,并提出基于最小生成树法的管道铺设线路优化模型,实现了管道铺设优化问题。

对于完全图从空间上讲,显然Prim算法比Kruskal算法占用更少的空间,因为在存储上n*n的矩阵,但Kruskal算法则是存储的边表,包括构成一条边的两点信息,边的权值。故而Prim算法相比于Kruskal算法更适合在稠密的图中求解最小生成树,kruskal算法对边的稀疏图比较合适。在时间上,Kruskal算法的时间复杂度依赖于对边的排序,所以时间复杂度的上界为O(eloge)(采用快排),e是边数,与顶点无关。而Prim算法的时间复杂度为0(n^2),与边无关。

在实际应用中,Prim算法比较符合在小区中铺设网线的实际情况,因为在现实中任意两栋楼房之间一般都是可以用网线连接的,属于稠密图。

7 参考文献

[1] 严蔚敏. 数据结构(第二版)[M]. 清华大学出版社, 1992:60-63.

[2] 余祥宣、崔国华、邹海明.计算机算法基础(第三版).华中科技大学出版社,2006:60-63.

可视化最小生成树Prim、Kruskal相关推荐

  1. 数据结构实验之图论六:村村通公路(最小生成树Prim/Kruskal)

    Description 当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出 ...

  2. HDU 1233 还是畅通工程(最小生成树 Prim+Kruskal)

    原题地址 http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意:(最小生成树裸题)有N个村庄,给出村庄两两之间的距离,要求铺设公路,使得任何两个村庄间都可 ...

  3. zoj 1586 QSNetwork 最小生成树 Prim Kruskal

    题意: 一个图,不止边有权值,点也有权值 Input: 输入的第一行包含一个整数t,它指示数据集的数量. 第二行中有T个数据集. 在单个数据集中,第一行包含一个整数n,表示qs的数目. 第2行包含n个 ...

  4. poj1861 最小生成树 prim amp; kruskal

    // poj1861 最小生成树 prim & kruskal // // 一个水题,为的仅仅是回味一下模板.日后好有个照顾不是#include <cstdio> #include ...

  5. 最小生成树算法详解(prim+kruskal)

    最小生成树概念: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里 ...

  6. ReviewForJob——最小生成树(prim + kruskal)源码实现和分析

    [0]README 1)本文旨在给出 ReviewForJob--最小生成树(prim + kruskal)源码实现和分析, 还会对其用到的 技术 做介绍: 2)最小生成树是对无向图而言的:一个无向图 ...

  7. 图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)

    一.基础知识   有向图   无向图 以无向图为例: 邻接矩阵: 度矩阵(对角矩阵): 二.最小生成树 应用:将网络顶点看着城市,边看着城市之间通讯网,边的权重看着成本,根据最小生成树可以构建城市之间 ...

  8. poj 2031 BuildingaSpaceStation 最小生成树 Prim、Kruskal

    题意: 三维空间里有一些球,给出球心坐标和半径,搭建通路,使得他们能够相互连通.如果两个球相交或者相切,则算已连通,无需再搭桥.求搭建通路的最小费用(费用就是边权,就是两个球面之间的距离). Inpu ...

  9. 最小生成树:Kruskal算法 和 Prim算法(第23章)

    武侠: 飞雪连天射白鹿,笑书神侠倚碧鸳. --金庸十四著作 飞狐外传 .雪山飞狐 .连城诀 .天龙八部 .射雕英雄传 .白马啸西风 .鹿鼎记 .笑傲江湖 .书剑恩仇录 .神雕侠侣 .侠客岛 .倚天屠龙 ...

最新文章

  1. Smart Link
  2. 在Android NDK中使用OpenSSL
  3. Android之提示android.content.res.Resources$NotFoundException: Resource ID #0x7f08010a
  4. 这样就算会了PHP么?-11
  5. 开通5G网络服务三个月,中国广电交出了什么样的答卷?
  6. 西门子STEP7-200PLC的顺序控制编程
  7. C# 如何将Excel表格复制到Word中并保留格式
  8. 英文数字字母听力模拟的简单实现
  9. Fildder主菜单----Edit介绍
  10. App发送短信验证码实现
  11. C语言:链表(动态)创建之头插法和尾插法
  12. 作为运营,如何在职场上野蛮生长
  13. 宥马运动服务器正在维护,宥马运动ios版
  14. c语言26字母排序,C语言,26个字母的冒泡排序
  15. 使用代理爬去微信公众号_Python3网络爬虫开发实战之使用代理爬取微信公众号文章...
  16. ubuntu下安装wps出现系统缺失字体问题?
  17. Day25 LeetCode 216. 组合总和 III 17. 电话号码的字母组合
  18. Calendar日期类获取上月同期需求
  19. 友盟受访页面_调整我们如何询问受访者的性别
  20. 常用测试用例模板大全

热门文章

  1. Boke and Tsukkomi——一般图匹配+带花树算法
  2. Friedman test和Nemenyi test
  3. manifest.xlm配置错误信息
  4. oracle 闪存查询,【oracle相关】关于数据闪存恢复的说明
  5. 数字与能源,交织成新基建的摩比斯环
  6. 硬屏软屏哪个寿命长?
  7. 二级建造考试复习资料-市政
  8. 我所理解的RESTful Web API [Web标准篇]
  9. 你需要知道的前端跨域知识(同源、正向代理、反向代理、前端代理、nignx反向代理)
  10. Proe Creo 二次开发之获得阵列组信息