《实验四:图的深度优先及广度优先遍历》由会员分享,可在线阅读,更多相关《实验四:图的深度优先及广度优先遍历(36页珍藏版)》请在金锄头文库上搜索。
1、-实验报告学院系名称:计算机与通信工程学院* * *专业计算机科学与技术班级2015级*班实验工程实验四:图的深度优先与广度优先遍历课程名称数据构造与算法课程代码0661013实验时间2017年5 月 12日第5-6节实验地点7-216考核标准实验过程25分程序运行20分答复以下问题15分实验报告30分特色功能5分考勤违纪情况5分成绩成绩栏其它批改意见:教师签字:考核内容评价在实验课堂中的表现,包括实验态度、编写程序过程等内容等。功能完善, 功能不全有小错无法运行正确根本正确有提示无法答复完整较完整一般内容极少无报告有无有无一、 实验目的理解图的逻辑特点;掌握理解图的两种主要存储构造邻接矩阵和
2、邻接表,掌握图的构造、深度优先遍历、广度优先遍历算法二、 实验题目与要求1. 每位同学按下述要*现相应算法:根据从键盘输入的数据创立图图的存储构造可采用邻接矩阵或邻接表,并对图进展深度优先搜索和广度优先搜索1问题描述:在主程序中提供以下菜单:1图的建立2深度优先遍历图3广度优先遍历图0完毕2实验要求:图的存储可采用邻接表或邻接矩阵;定义以下过程:CreateGraph(): 按从键盘的数据建立图DFSGrahp():深度优先遍历图 BFSGrahp():广度优先遍历图3实验提示: 图的存储可采用邻接表或邻接矩阵; 图存储数据类型定义邻接表存储 # define MA*_VERTE*_NUM 8
3、 /顶点最大个数typedef struct Arode int adjve*; struct Arode *ne*tarc; int weight; /边的权Arode; /表结点# define Verte*Type int /顶点元素类型typedef struct VNode int degree,indegree; /顶点的度,入度 Verte*Type data; Arode *firstarc; Vnode /*头结点*/; typedef struct Vnode verticesMA*_VERTE*_NUM; int ve*num,arum;/顶点的实际数,边的实际数ALGr
4、aph; 4注意问题: 注意理解各算法实现时所采用的存储构造。 注意区别正、逆邻接。2. 拓扑排序:给出一个图的构造,输出其拓扑排序序列顶点序列用空格隔开,要求在同等条件下,编号小的顶点在前。3利用最小生成树算法解决通信网的总造价最低问题1问题描述:假设在 n 个城市之间建通信网络,架设 n-1 条线路即可。如何以最低的经济代价建立这个通信网,是一个网络的最小生成树问题。2实验要求:利用 Prim 算法求网的最小生成树。3) 实现提示:通信线路一旦建立,必然是双向的。因此,构造最小生成树的网一定是无向网。为简单起见,图的顶点数不超过 10 个,网中边的权值设置成小于 100。三、 实验过程与实
5、验结果应包括如下主要内容: 数据构造定义 图是由定点集合及定点间的关系集合组成的一种数据构造,其形式化定义为Graph = V,E其中,V = *|*个数据对象是定点的有限非空集合;E = *,y|*,yVPath(*,y)是顶点之间关系的有限集合,叫做便集。集合E中的Path*,y表示顶点*和顶点y之间有一条直接连线,即*,y表示一条边,它是有方向的。 算法设计思路简介 算法描述:可以用自然语言、伪代码或流程图等方式 1、 图的深度优先搜索: 在访问图中*一起始点V后,由V出发,访问它的任一邻接顶点w1;再从w1;出发,访问与w1邻接但还没有访问过得顶点w2;然后再从w2出发,进展类似的访问
6、,,如此进展下去,直至到达所有的邻接顶点都被访问过的顶点u为止;接着退回一步,回溯到u的前一个邻接顶点,看它是否还有其他没有被访问过的邻接点。如果有,则访问此邻接点,之后再从此顶点出发,进展与前述类似的访问;如果没有,就再退回一步进展搜索。重复上述过程,直至图中所有和V连通的顶点都被访问到。假设此时图*有顶点未被访问,则说明该图不是连通图,另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问过为止。 图的广度优先搜索: 使用广度优先搜索BFS在访问了起始顶点V之后,由V出发,依次访问V的各个未曾被访问过的邻接点w1,w2,wt,然后再顺序访问w1,w2,wt,的所有还为
7、访问过的邻接点。再从这些顶点出发,访问它们还未访问过的邻接点,如此做下去,直到图中所有顶点都被访问过为止。 2、 1将没有前驱入度为零的顶点进栈。 2从栈中退出栈顶元素输出,并把该顶点引出的所有弧删去,即把它的各个邻接点的入度减1,同时将当前已输出的顶点个数加1. 3将新的入度为零的顶点再进栈。 4重复2、2两步,直到栈为空为止。此时或者已经输出前部顶点,或者剩下的顶点中没有入度为零的顶点。 3、 设置一个n*n的矩阵Ak,其中除对角线元素为0外,其他元素A(k)ij表示顶点i到顶点j的路径长度,k表示运算步骤。开场时k = -1,A(-1)ij = arcsij,即A为图的邻接矩阵。以后逐步
8、尝试在原路径中参加其他顶点作为中间点,如果增加中间点顶点后,得到的路径比原来的路径短,则以此新路径代替原来路径,修改矩阵元素。具体做法为:第0步让所有路径上参加中间点0,去Aij与Ai0 + Aoj中较小的值作Aij的新值,完成后得到A(0)如此进展下去,当第n-1步完成后,得到A(n-1),A(n-1)即为所求的结果,A(n-1)ij表示从i到j路径上的中间顶点的序号小于或等于n-1的最短路径的长度,即A(n-1)ij表示从i到j的最短路径的长度。 算法的实现和测试结果:包括算法运行时的输入、输出,实验中出现的问题及解决方法等 1、 2、 3、 算法时间复杂度分析 1、 深度优先遍历:On*
9、n. 广度优先遍历:On*n. 2、 On+e. 3、 O(n*n*n).四、收获与体会不想说什么,这章的程序太难了,每次一想起来数据构造还没做就烦,前两个题根本上一天能做一道题,第三题也就是骗骗OJ,实际上还有个小BUG,等有空再写个真正符合题意的程序吧。五、源代码清单1、#includeusingnamespace std;#define INFINITY INT_MA*#define MA*_VERTE*_NUM 20/typedef enum DG,DN,AG,ANGraphKind;typedefint Elemtype;typedefstruct QueueNodeElemtype
10、 data;struct QueueNode *ne*t;QueueNode;typedefstruct QueueListQueueNode *front;QueueNode *rear;QueueList;QueueList *CreateQueue()QueueList *Q;QueueNode *p;Q = (QueueList*)malloc(sizeof(QueueList);p = (QueueNode*)malloc(sizeof(QueueNode);Q-front = Q-rear = p;Q-front-ne*t = NULL;return Q;bool QueueEmp
11、ty(QueueList *Q)if(Q-front = Q-rear)returntrue;elsereturnfalse;QueueList *EnQueue(QueueList *Q,int element)QueueNode *p;p = (QueueNode*)malloc(sizeof(QueueNode);p-data = element;p-ne*t = NULL;Q-rear-ne*t = p;Q-rear = p;return Q; QueueList *DeQueue(QueueList *Q,Elemtype *e)QueueNode *temp;if(!QueueEm
12、pty(Q)temp = Q-front-ne*t;*e = temp-data;Q-front-ne*t = temp-ne*t;if(Q-rear = temp)Q-rear = Q-front;free(temp);return Q;void display(QueueList *Q)QueueNode *temp;temp = Q-front;if(!QueueEmpty(Q)while(temp-ne*t != NULL)temp = temp-ne*t;cout data endl;typedefstruct Arc int adj;Arc,AdjMatri*MA*_VERTE*_
13、NUMMA*_VERTE*_NUM;typedefstruct int verte*MA*_VERTE*_NUM;AdjMatri* arcs;int ve*num,arum;/GraphKind kind;Graph;void CreateAG(Graph &G,int n,int m)int i,j;G.ve*num = n;G.arum = m;for(i = 0;i n;i+)G.verte*i = i + 1;for(i = 0;i n;i+)for(j = 0;j n;j+)G.arcsij.adj = 0;for(int k = 0;k i j;G.arcsi-1j-1.adj = G.arcsj-1i-1.adj = 1;bool visitedMA*_VERTE*_NUM;int count