




免费预览已结束,剩余12页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
北京邮电大学信息与通信工程学院 第 1 页 数据结构实验报告 实验名称 实验二 图 学生姓名 佘晨阳 班 级 2014211117 班内序号 20 学 号 2014210491 日 期 2015 年 12 月 05 日 1 实验要求 根据图的抽象数据类型的定义 使用邻接矩阵或邻接表实现一个图 图的基本功能 1 图的建立 2 图的销毁 3 深度优先遍历图 4 广度优先遍历图 5 使用普里姆算法生成最小生成树 6 使用克鲁斯卡尔算法生成最小生成树 7 求指定顶点到其他各顶点的最短路径 8 其他 比如连通性判断等自定义操作 编写测试 main 函数测试图的正确性 2 程序分析 本实验要求掌握图基本操作的实现方法 了解最小生成树的思想和相关概念 了 解最短路径的思想和相关概念 学习使用图解决实际问题的能力 2 1 存储结构 存储结构 1 不带权值的无向图邻接矩阵 2 带权值的无向图邻接矩阵 3 带权值的有向图邻接矩阵 1 不带权值的无向图邻接矩阵 北京邮电大学信息与通信工程学院 第 2 页 2 带权值的无向图邻接矩阵 3 带权值的有向图邻接矩阵 备注备注 1 在使用打印元素 在使用打印元素 BFS DFS 采用无权值的无向图邻接矩阵存储方式采用无权值的无向图邻接矩阵存储方式 2 在使用在使用 PRIM KRUSKAL 3 在使用最短路径的算法时采用具有权值的有向图邻接矩阵存储方式在使用最短路径的算法时采用具有权值的有向图邻接矩阵存储方式 2 2 关键算法分析 北京邮电大学信息与通信工程学院 第 3 页 一 图的邻接矩阵构造函数一 图的邻接矩阵构造函数 1 关键算法 template Graph Graph f a int n int e 带权值的图的构造函数 int i j k height f s1 s2 vnum n arcnum e for k 0 k n k vertex k a k 初始化顶点 for k 0 k n k for i 0 i n i arc k i 1 if i k arc k i 0 初始化权值的大小 visited k 0 cout endl for k 0 k e k 初始化边 cout s1 s2 height arc convert s1 convert s2 height arc convert s2 convert s1 arc convert s1 convert s2 采用无向图带权值的 邻接矩阵 cout endl cout 所得邻接矩阵为 endl for k 0 k n k for i 0 i n i if arc k i 1 cout else cout arc k i 打印邻接矩阵的格式 cout endl cout endl 2 算法的时间复杂度 北京邮电大学信息与通信工程学院 第 4 页 有构造可知 初始化时其时间复杂度 O n2 二 深度优先便利二 深度优先便利 DFS 1 关键算法 从某顶点 v 出发并访问 访问 v 的第一个未访问的邻接点 w 访问 w 的第一个未访问的邻接点 u 若当前顶点的所有邻接点都被访问过 则回溯 从上一级顶点的下一个未访问过的顶点 开始深度优先遍历 直到所有和 v 路径相通的顶点都被访问到 2 代码图解 深度优先遍历示意图 3 代码详解 template void Graph DFS int v cout vertex v visited v 1 for int j 0 j 1 DFS j 当存在回路时 则连通深一层遍 历 4 时间复杂度 时间复杂度 O n2 空间复杂度 栈的深度栈的深度 O n 辅助空间辅助空间 O n 北京邮电大学信息与通信工程学院 第 5 页 三 广度遍历三 广度遍历 BFS 1 关键算法 访问顶点 v 依次访问 v 的所有未被访问的邻接点 v1 v2 v3 分别从 v1 v2 v3 出发依次访问它们未被访问的邻接点 反复 直到所有和 v 路径相通的顶点都被访问到 2 代码图解 3 代码详解 1 初始化队列 Q 2 访问顶点 v visited v 1 3 while 队列非空 3 1 v 队头元素出队 3 2 访问队头元素的所有未访问的邻接点 4 时间复杂度 时间复杂度 O n2 空间复杂度 辅助空间辅助空间 O n 四四 最小生成树最小生成树 普里姆算法普里姆算法 1 关键思路 一般情况下 假设 n 个顶点分成两个集合 U 包含已落在生成树上的结点 和 V U 尚未落 在生成树上的顶点 则在所有连通 U 中顶点和 V U 中顶点的边中选取权值最小的边 主数据结构 邻接矩阵 辅助数据结构 北京邮电大学信息与通信工程学院 第 6 页 int adjvex MAXSIZE U 集中的顶点序号 int lowcost MAXSIZE U V U 的最小权值边 2 代码图解 北京邮电大学信息与通信工程学院 第 7 页 北京邮电大学信息与通信工程学院 第 8 页 3 代码详解 template void Graph Prim for int i 0 i vnum i 辅助数组存储所 有到的 V0 边 adjvex i 0 lowcost i arc 0 i lowcost 0 0 for int j 1 j vnum j 循环 n 1 次 int k Mininum lowcost 求下一个顶 点 cout vertex adjvex k vertex k endl lowcost k 0 U U Vk for int j 0 j vnum j 设置辅助数组 if lowcost j 0 adjvex j k 北京邮电大学信息与通信工程学院 第 9 页 4 时间复杂度 时间复杂度 O n2 适合稠密图 五五 最小生成树最小生成树 克鲁斯卡尔算法克鲁斯卡尔算法 1 关键思路 先构造一个只含 n 个顶点的子图 SG 然后从权值最小的边开始 若它的添加不使 SG 中产 生回路 则在 SG 上加上这条边 如此重复 直至加上 n 1 条边为止 2 代码图解 3 代码详解 template void Graph Kruskal 最小生成树 kruskal 算法 cout Krusal 算法结果为 endl int vset MAXSIZE for int i 0 i vnum i vset i i int k 0 j 0 while k vnum 1 int m vedgelist j fromv n vedgelist j endv int sn1 vset m int sn2 vset n 两个顶点分属 北京邮电大学信息与通信工程学院 第 10 页 不同的集合 if sn1 sn2 cout vertex m vertex n endl k for int i 0 i vnum i if vset i sn2 vset i sn1 集合 sn2 全 部改成 sn1 j 4 时间复杂度 时间复杂度 O nlogn 适合稀疏图 六 最短路径六 最短路径 Dijkstra 算法算法 1 关键代码 按路径长度递增的次序产生源点到其余各顶点的最短路径 1 设置集合 s 存储已求得的最短路径的顶点 2 初始状态 s 源点 v 3 叠代算法 直接与 v 相连的最近顶点 vi 加入 s 从 v 经过 vi 可以到达的顶点中最短的 加入 s 2 代码图解 北京邮电大学信息与通信工程学院 第 11 页 3 代码详解 emplate void Graph ShotPath f x 关于最短路 径的初始化 int v convert x for int i 0 i vnum i 初始化路径和 点 s i 0 disk i arc v i if disk i maxs path i v else path i 1 s v 1 disk v 0 path v 1 for int i 0 i vnum i 反复经过从该 点到其他点的路径 if v FindMin 1 continue s v 1 for int j 0 j arc v j disk v 北京邮电大学信息与通信工程学院 第 12 页 disk j arc v j disk v path j v Print 打印路径 长度和遍历 4 时间复杂度 时间复杂度为 n 2 七 判断连通图算法七 判断连通图算法 template bool Graph judgegraph DFS convert vertex 0 if count vnum cout 该图为连通图 输入成功 endl return false else cout 该图不为连通图 请重新输入 endl return true 时间复杂度 n 2 3 程序运行结果 1 测试主函数流程 北京邮电大学信息与通信工程学院 第 13 页 函数流程图 1 输入图的连接边并打印 构造下面所示图的邻接矩阵 北京邮电大学信息与通信工程学院 第 14 页 2 判断图连通是否成功判断图连通是否成功 3 BFS DFS PRIM 算法的实现 北京邮电大学信息与通信工程学院 第 15 页 4 克鲁斯卡尔算法实现过程 4 有向图邻接矩阵的构建 北京邮电大学信息与通信工程学院 第 16 页 插入 V0 位置后打印距离并开始回溯 总结 1 调试时出现的问题及解决的方法 问题一 prim 算法中 解决方法 调整循环条件 修正函数体注意有无 Next 的区别 北京邮电大学信息与通信工程学院 第 17 页 问题二 BFS 和 DFS 同时在一个类里作用时会输出错误 解决方案 每次 BFS DFS 使用时都把 visited 数组初始化一遍 问题三 在最短路径 经常出现了停止输入的情况 解决方法 改 return 为 continue 并修改打印算法 2 心得体会心得体会 通过本次实验 基本熟练掌握了 c 基本语句 尤其对图的结构及应用有了较深了 解 调试代码时尽量做到完成一个代码段调试一次 可以最快检测出错误所在 类的封装 和调用 类的共有成员和私有成员的设置 3 下一步的改进下一步的改进 第一 设置增加图节点和边的函数 第二 实现图形化输出图的路径的功能 第三 主函数设计简单 不要过
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/CI 196-2023医疗知识图谱构建技术要求
- T/SHEPEA 004-2024110 kV户内型GIS安装工程监理规范
- 2025年环保行业绿色能源市场前景研究报告
- 2025年电子产品行业物联网技术应用前景报告
- 常德市2025湖南常德市西洞庭管理区事业单位招聘现场笔试历年参考题库附带答案详解
- 2025年汽车行业智能驾驶汽车市场前景研究报告
- 压力容器制造与安全培训课件
- 国家事业单位招聘2025中国水权交易所招聘第二轮考试笔试历年参考题库附带答案详解
- 云南省2025云南保山市生态环境工程评估中心招聘(6人)笔试历年参考题库附带答案详解
- 2025贵州六枝特区国源(集团)有限责任公司招聘20人笔试参考题库附带答案详解
- 大模型概念、技术与应用实践 课件 第6章 智能体
- 舞蹈基础教学舞蹈基础知识科普培训PPT教学课件
- 安全教育7不要离家出走
- 最新鲁科版四年级上册英语Unit 4《Lesson 1 Its spring》课件
- 工程项目质量管理手册范本
- 养老机构入住老人服药记录表模板
- 家谱模板,树形图(绝对精品,一目了然)
- 决策分析管理运筹学课件
- 新能源汽车技术完整版课件
- T∕CAME 27-2021 医院物流传输系统设计与施工规范
- PFMEA密封圈范例
评论
0/150
提交评论