第六章主要进行有关图的学习,这一章学得东西很多,涉及图的方方面面包括如何定义存储结构,如何初始化,如何建立一张图,如何进行图的操作等等。
6-1 |
主要学习了图的基本知识,不带权图包括有向图,无向图,带权图包括有向网络,无向网络。在求度的时候要注意无向图和有向图的区别,有向图包括入度和出度。 连通分量=>最大连通子图(无向图) |
6-4 |
存储方式的定义,主要学习了邻接矩阵和邻接表两种定义方式。邻接矩阵的话采用的是二维数组的方式,在图中有边为0,无边为1,在网络中,有边则存储边的权值,无边为INT_MAX 邻接表的话用了局部链表的方式,主图包括了数据域和指针域,数据域为顶点值,指针域为右边的顶点组成的链表集合 (邻接矩阵和邻接表具体的定义这里没有给出) |
6-5 |
这一小节介绍了图的遍历的相关知识点,BMS和DMS(广度优先搜索、深度优先搜索),DMS类似于树的先序遍历采用递归的方法, BMS类似于树的层次遍历,要用到辅助的数据结构队列。 对于连通图来说,DMS和BMS执行一次就可以得到正确的遍历结果,如果是非联通图的话,则要在此之上嵌套一层for循环对每个顶点都进行一次DMS和BMS,其中用辅助数组 checked[]来记录该顶点是否被访问过 for(.........){ if(checked[i) continue; else DMS()/BMS() } |
|||||||||||||||||||||||||||||||||||||||||||||||||||
6-6 |
这小节介绍了图的应用包括最小生成树、最短路径拓扑排序。最小生成树介绍了普里姆算法和克鲁斯卡尔算法。 下面是普里姆算法:总体的过程涉及选择和刷新两个过程
知道 Lowcost全部结束的话就可以生成最小生成树了。 下面是克鲁斯卡尔算法: 采用Edge[]和 vexset[]两个辅助数组,前者储存边的2个顶点和权值,后者存储对应所在的连通分量 最短路径:
S表示该顶点是否更新过最短路径 D表示的是对应每条边的最短路径 Path对应的在边最短的情况下与之相连的顶点下标 更新的时候找出所有路径最短的那一个对D、S、Path进行更新,直到s所有的元素都为1(连通图) |
在做作业的时候知识点比较多,最近记性不怎么好,所以回盘的时间比较多,效率相对来说有点低。实践题一开始觉得应该挺好做的,但是做的时候又有些问题,数组没有初始化呀,距离公式写错了等一系列问题。后续学习上课还要集中精力,认真学习。