数据结构与算法(五)图结构

了解图的实现方法,然后从遍历角度将图转化为树。进而,利用基本数据结构并基于遍历模式,设计图算法的主要方法。最后,从“数据结构决定遍历次序”出发,概括遍历算法。实现选择和改进数据结构,从而高效实现图算法。

1.图结构含义

图包含顶点集合V,边集合E。均为有限集。根据边有无方向分为无向图,有向图以及混合图。图属于非线性结构,通过遍历将其转化为半线性结构,进而借助树结构已有的处理方法和技巧,最终解决问题。有向图为重点。与顶点V关联的边数称作V的度数顶点有出度和入度。

2.图构造

以邻接矩阵形式构造:顶点集向量,边集向量=二维矩阵向量。基于向量结构。

以邻接表形式构造:顶点集向量,边集列表=邻接表数等于顶点总数。其效率高于领接矩阵。

3.图搜索

图的遍历也要求访问所有顶点一次,所有边一次。有广度优先搜索,深度优先搜索,最佳优先搜索,均可以在线性时间内完成。为O(N+E)。

1.广度优先搜索:先访问顶点S;再依次访问S所有尚未访问到的邻居;再按后者被访问到的次序,逐个访问其邻居。上述BFS策略等效于树结构的层次遍历。算法如下:

广度优先算法:

每个顶点都有状态即已发现与未发现,访问。

邻接顶点的含义:顶点A与顶点B的首个邻接顶点,边A->B存在,则B为A的邻接顶点。

也就是说A的邻居为边A->X存在的顶点X,有方向。逆向求取首个邻接顶点。

边在遍历树中类型,有tree类型,有CROSS类型为已被发现的邻居。

引入树边拓展支撑树,也就是在顶点之间建立父子关系,但不建立左右关系。

1.逐一检查所有顶点,一旦遇到尚未发现的顶点,即从该点启动BFS。解决多个单连通区域问题。

2.BFS算法:
    引入队列Q,起点入队。
    while(队列不为空):
        取出队首S,遍历S的所有邻居顶点U;
        FOR U IN S:
            if U未发现 则 发现该顶点并入队,引入树边支撑树PARENT(U)=S;
            else  则  将(S,U)归类于CROSS。
        顶点S访问完毕。

基于BFS,可有效的解决连通域分解、最短路径等问题。

3.DFS算法:
    取出队首S,遍历S的所有邻居顶点U;
        FOR U IN S:
            根据状态处理,SWITCH语句。
            if U未发现 则 发现该顶点并以该顶点为基点进行递归访问,引入树边支撑树PARENT(U)=S;
            else  则  将(S,U)归类于CROSS。
        顶点S访问完毕。

2.DFS的应用:拓扑排序和双连通域分解。

拓扑排序:给定一有向图,如何在相容的前提下,将所有顶点排成一个线性序列。有向无环图必然可以拓扑排序。

拓扑排序算法:
1.将入度为0的顶点从图G中取出,则剩余的G'依然是有向无环图。依次迭代即可。
2.
优先级搜索:BFS和DFS不同点为对顶点的选取不同。给定一个策略即,给与所有顶点不同的优先级,随着算法的推进而调整;而每一步迭代所选取的顶点,都是当时的优先级最高者。则可将BFS和DFS归纳为一种框架下。

优先级搜索框架:
        起点S加入PFS树中;
        while(1):
            遍历S的所有邻居并利用优先级策略更新顶点优先级及其父节点。
            从尚未加入遍历树的所有顶点中选出下一个优先级最高的顶点S。
            直到所有顶点均加入,则退出。
            将S及其父的连边加入遍历树。

            

3.最小支撑树:图G为一带权网络,若存在某一无环连通子图T覆盖G中的所有顶点,则称作G的一颗支撑树,代价最小的即为最小支撑树。

猜你喜欢

转载自blog.csdn.net/u013070875/article/details/85616164