“学习笔记”之《算法导论》----第六部分----图算法----第二十二章----基本的图算法

本人大四即将结束,于2018年12月18日购《算法导论》这本书,慢慢看,第一阶段先主要理解各个章节说的算法都是什么意思,书上的课后习题先不做,用得上什么算法我再详细学习。这是官方课后答案的链接

放在开头:没有好的算法,坏的算法之说,重点是针对不同的情况,针对不同的数据,针对不同的需求,去选择算法,改良算法。我的数学功底不强,太难的公式我看不懂,太高深的思想我理解不了,我主要以应用为主,不以解释数学公式为主。

 这是我第一次接触“图”这个概念。我认为这是集合的一种表示方法

定义:对于图G=(V,E),其中V代表vertex顶点,E代表edge边,像是无根树一样,有结点,有连同两个结点的边。

对下图而言,V是(1,2,3,4,5),E是{(1,2),(1,5),(5,4),(2,4),(4,3),(2,3)}。

“学习笔记”之《算法导论》----第六部分----图算法----第二十二章----基本的图算法

无向图:两个结点之间没有谁指向谁的区别,上面这个就是个无向图。

有向图:两个结点之间的连接有方向,就上图而言,如果‘1’结点到‘2’结点有方向,那么就用一个‘→’代替这两个结点之间的连线,那么这个图就变成了一个有向图。

有向图的转置:结点位置不变,箭头方向全部换向。

图有两种表示方法,邻接链表和邻接矩阵

 广度优先搜索

这是最简单的图搜索算法之一,将来所要接触的Dijkstra的单元最短路径算法都使用了类似广度优先搜索的思想。

给定G=(V,E)这样一个图,和一个源节点s(可以是通过例子滤波方法确定的起点),该算法能计算s到每个可到达结点的距离,同时生成一颗“广度优先搜索树”。该树以s为树根,包含了所有可以从s到达的结点。

中心思想:算法需要在发现所有距离源节点s为k距离的所有结点之后,才会发现距离源结点s为k+1距离的结点。

深度优先搜索

只要可能,就在图中的某个结点尽量“深入”。

深度优先搜索总是对最近才发现的结点v的出发边进行探索,知道该结点的所有出发边都被发现为止。一旦结点v的所有出发边都被发现了,搜索则回到v的前驱结点,来搜索这个前驱结点的出发边。

与之前不同的是,该算法在每个结点上加了一个时间戳,每个结点有两个时间戳,第一个时间戳记录了结点第一次被发现的时间,第二个时间戳记录了完成对v的邻接链表扫描的时间。第一个是发现时间,第二个是完成时间。

拓扑排序

拓扑排序是通过深度排序得到的(前提,这个图必须是有向无环图)

拓扑排序中,所有的结点按照其完成时间的逆序被排成从左至右的一条水平线,所有的有向边都从左指向右。

强连通分量

大致意思就是,如果几个结点之间是存在循环关系:从某个结点出发,还会通过其他节点再回来,就叫循环关系,这几个节点叫这个图的强连通分量。

我们就可以把存在循环关系的结点群看成是一个节点,这样会使问题变得更简单。

经过合并处理后的图是一个无环图。