数据结构报告3.docx

数据结构实验报告_信安1302_0906130212_彭澍 第  PAGE 45 页 共  NUMPAGES 45 页 中南大学 数据结构实验报告 目 录 TOC \o 1-3 \h \u  HYPERLINK \l _Toc407563608 1.实验内容  PAGEREF _Toc407563608 \h 3  HYPERLINK \l _Toc407563609 2.程序设计思路  PAGEREF _Toc407563609 \h 3  HYPERLINK \l _Toc407563610 3.主要算法  PAGEREF _Toc407563610 \h 5  HYPERLINK \l _Toc407563611 1、最小生成树  PAGEREF _Toc407563611 \h 5  HYPERLINK \l _Toc407563612 2、拓扑排序  PAGEREF _Toc407563612 \h 14  HYPERLINK \l _Toc407563613 3、深度优先搜索和广度优先搜索  PAGEREF _Toc407563613 \h 22  HYPERLINK \l _Toc407563614 4、最短路径  PAGEREF _Toc407563614 \h 35  HYPERLINK \l _Toc407563615 4.运行结果  PAGEREF _Toc407563615 \h 42  HYPERLINK \l _Toc407563616 5.设计中的问题和解决方案  PAGEREF _Toc407563616 \h 45  数据结构实验报告3 1.实验内容 图的操作算法 实现图的常用操作算法:包括建立图的存储结构、深度优先搜索和广度优先搜索,求图的最小生成树、拓扑排序、最短路径等。 2.程序设计思路 1.最小生成树 Prim算法 设G = (V,E)是连通带权图,V = {1,2,…,n}。构造G的最小生成树Prim算法的基本思想是:首先置S = {1},然后,只要S是V的真子集,就进行如下的贪心选择:选取满足条件i ∈S,j ∈V – S,且c[i][j]最小的边,将顶点j添加到S中。这个过程一直进行到S = V时为止。在这个过程中选取到的所有边恰好构成G的一棵最小生成树。 Kruskal算法 当图的边数为e时,Kruskal算法所需的时间是O(eloge)。当e = Ω(n^2)时,Kruskal算法比Prim算法差;但当e = o(n^2)时,Kruskal算法比Prim算法好得多。 2.图的深度优先搜索 递归实现 (1)访问顶点v;visited[v]=1;//算法执行前visited[n]=0 (2)w=顶点v的第一个邻接点; (3)while(w存在) if(w未被访问) 从顶点w出发递归执行该算法; w=顶点v的下一个邻接点; 非递归实现 (1)栈S初始化;visited[n]=0; (2)访问顶点v;visited[v]=1;顶点v入栈S (3)while(栈S非空) x=栈S的顶元素(不出栈); if(存在并找到未被访问的x的邻接点w) 访问w;visited[w]=1; w进栈; 3.拓扑排序 (1)在AOV网络中选一个没有直接前驱的顶点, 并输出之; (2)从图中删去该顶点, 同时删去所有它发出的有向边; (3)重复以上步骤, 直到全部顶点均已输出,拓扑有序序列形成,拓扑排序完成;或者图中还有未输出的顶点,但已跳出处理循环。这说明图中还剩下一些顶点,它们都有直接前驱,再也找不到没有前驱的顶点了。这时AOV网络中必定存在有向环。(拓扑排序完成;AOV网络中必定存在有向环) 4.了解了最短路径算法 单源最短路径问题:已知有向带权图(简称有向网)G=(V,E),找出从某个源点s∈V到V中其余各顶点的最短路径。迪杰斯特拉(Dijkstra)算法求单源最短路径。 3.主要算法 1、最小生成树 #includestdio.h #includestdlib.h #includeiostream #define MAX_VERTEX_NUM 20 #define OK 1 #define ERROR 0 #define MAX 1000 using namespace std; typedef struct Arce

文档评论(0)

1亿VIP精品文档

相关文档