天气越来越热,看书还得静得下心啊,今天继续图这一章,概念和算法众多,第一遍看以广度优先的形式为主,以后若要用到具体的算法再去翻“算法导论”吧。下面是学习内容和笔记。
图(graph)
1.图的存储结构
邻接矩阵:顶点数组 + 边数组(二元);无向图的边数组为对称矩阵,有向图非对称(行的元素和表顶点的出度和,列对应入度和);网图的边数组中元素由布尔型变为权值。
邻接表:顶点表(data+firstedge) + 边表(adjvex+next);有向图的边表分出边表和入边表;带权的网图,在边表中增加一个weight的数据域。
十字链表:是对有向图邻接表的优化;将邻接表和逆邻接表结合,重新定义顶点表(data+firstin+firstout),边表结点结构(tailvex弧尾下标 + headvex弧头下标 + headline +taillink);创建算法的时间复杂度和邻接表相同,但是出度和入度可同时方便的求得——关注顶点。
邻接多重表:是对无向图邻接表的优化;重新定义边表结构(ivex + ilink + jvex + jlink);ivex和jvex表一条边的两个顶点,ilink表指向依附顶点ivex的下一条边,jlink表指向依附顶点jvex的下一条边;同一条表,邻接表用两个顶点表示,邻接多重表用一个顶点表示——关注边。
边集数组:由两个一维数组组成,顶点数组+边数组(begin + end + weight)。
2.图的遍历
深度优先DFS(depth first search)和广度优先BFS(breadth first search)。
3.最小生成树
一个连通图(带权)的生成树是一个极小的连通子图,含全部n个顶点,只含恰足以构成一棵树的n-1条边,把构成连通网的最小代价生成树称为最小生成树。
Prim(普里姆)算法: N=(V,{E})是连通图,开始时从V中任取一点u并入顶点集U,从V-U中取一点vi,从U中取一点ui,使得(ui,vi)权最小,将vi并入U;重复上述过程,直至U =V.
Kruskal(克鲁斯卡尔)算法:严版 P175。
4.最短路径
定义:指源顶点到终顶点之间的经过的边上的权值之和最少的路径。
Dijkstra(迪杰斯特拉)算法:初态:D[j] = MIN{D[i] | vi属于V};次短路径的终点是vk,则下一条次短的路径为或是(v,vk)或是(v,vj,vk)。
Floyd(弗洛伊德)算法:三个for循环。
5.拓扑排序:AOV网;拓扑排序算法:建立邻接表,顶点表(in + data + firstedge)+边表——解决工程能否顺利进行,并给出顶点的顺序。
6.关键路径:AOE网;解决工程完成需要的最短时间——注意与最短路径相区别,关键路径求的是网中权值和(时间和)最大的一条路径,即关键路径;算法原理由etv(通过拓扑排序计算得到)和ltv求得ete和lte,根据ete[k]与lte[k]是否相等来判断ak是否是关键路径上的关键活动。
Learning Data Structure_5_图(2)