当前位置:文档之家› 北邮数据结构实验报告

北邮数据结构实验报告

根据图的抽象数据类型的定义,使用邻接矩阵或邻接表实现一个图。
图的基本功能:
1、图的建立
2、图的销毁
3、深度优先遍历图
4、广度优先遍历图
5、使用普里姆算法生成最小生成树
6、使用克鲁斯卡尔算法生成最小生成树
7、求指定顶点到其他各顶点的最短路径
8、其他:比如连通性判断等自定义操作
编写测试main()函数测试图的正确性
2.心得体会
编写代码是一个熟能生巧的程,经过几次练习不仅提高了代码的输入速度,还增进了对代码的理解,对于书本上代码出现的一些错误也能及时发现。
3.下一步的改进
未设计错误处理,没有考虑到输入有误的情况。可加入对输入的判断,判断输入数据是否合理,不合理则输出“请重新输入”。也没有设计判断图是否联通的算法。由于有向图和无向图的区别,我编写了两段代码,无向图用来验证两种遍历,prim和kruskal算法,有向图用来验证最短生成路径的算法,可以考虑将两份代码合二为一。
若被考察边的两个顶点属于T的两个不同连通分量,则将此边加入到TE中,同时将两个连通分量连接为一个连通分量;
若被考察边的两个顶点属于同一连通分量,则舍此边,以免造成回路。
时间复杂度:O(n²)
2.2.4 Dijkstra算法
1.首先找出从源点能够直接到达的顶点的所有路径,并从中选出一条最短的路径。
2.然后以这条已选出的最短路径作为转发路径,找出经过这条路径转发后到达其他顶点的路径,并从中选出一条最低按的路径,如果经过这条路径转发bouquet到达目的节点比直接从源点到达目的节点路径要长,就不转发。
③while(w存在);
④if(w未被访问);
⑤w=下一个邻接点
时间复杂度:O(n²)
2.2.2广度遍历
(1)初始状态:所有结点均未被访问,附设一个数组记录结点状态,即
bool visited[MAX_SIZE]={0};
(2)从结点v开始访问,每访问一个结点,设置该结点的visited[v]=1。
重复执行:在所有u∈U,v∈V-U的边中找一条代价最小的边(u,v)并入集合TE,同时v并入U,直至U=V为止。此时TE中必有n-1条边,T就是最后得到的最小生成树。
lowcost[n]:集合V-U中各顶点与集合U中顶点最短边的权值,lowcost[v]=0表示顶点v已加入最小生成树中;
adjvex[n]:边在集合U中的顶点。
(3)找结点v的所有未访问结点
算法步骤:
初始化队列Q
访问顶点v,visited[v]=1。
while(队列非空):
v=队头元素出队;
访问队头元素的所有未访问的邻接点。
时间复杂度:O(n²)
2.2.2 prim算法
设G=(V,E),具有n个顶点的连通网;
T=(U,TE),G的最小生成树,初始状态为U={u0}(u0∈V),TE={};
3.重复执行2,直到找到所有顶点的路径位置。
3.程序运行结果
4.总结
1.调试时出现的问题及解决的方法
这次实验程序较上次相比复杂程度有所增加,在调试过程中也出现了很多问题。深度遍历是一个递归函数,最开始我的visited数组的初始化语句写在的函数内,导致遍历根本停不下来。调试kruskal算法时出现了输出结果与理论结果不符的情况,宿舍的另一个同学也出现了相同的情况,经过我们讨论研究发现是在给边集数组赋值时忘记去除arc[i][j]=0的情况,导致输出结果出现错误。生成最短路径时由于一开始构造的是无向网所以程序无法正常运行,后重新加上了构造有向网的过程。
lowcost[j]=min { cost (vk,vj) |vk∈U}
adjvex[j]=k
时间复杂度:O(n²)
2.2.3 kruskal算法
1.设无向连通网为G=(V,E),令G的最小生成树T=(U,TE),其初态为U=V, TE={},这样T中各顶点各自构成一个连通分量。
2.将图中边(存于边集数组E)按权值由小到大排序,依次考察边集E中各边:
(1)初始状态:所有结点均未被访问,附设一个数组记录结点状态,即
bool visited[MAX_SIZE]={0};
(2)从结点v开始访问:每访问一个结点,设置该结点的visited[v]=1.
(3)找结点v的第一个未访问的临接点。
算法步骤:
①访问结点v,设置visited[v]=1;
②w=v的第一个邻接点;
2.程序分析
2.1存储结构
•用一维数组存储顶点信息
•用二维数组(邻接矩阵)存储顶点之间的关系(弧或边)
无向图的矩阵如下图所示,其具有对称性。
•Aij=0(i,j)VR
•Aij=1 (i,j)VR




•网的邻接矩阵为:
•Aij=wiji≠j
•Aij=0 i=j
•Aij=∞其他

2.2关键算法分析
2.2.1深度遍历
相关主题