好久都没有碰过算法了,今天看了算法导论的图论基础,总结一下。
只列出关键词,具体算法可百度关键词,只是帮助自己理解,很多词语用得不严禁
图的表示
图由点(V)和边(E)构成,边存在有向边,无向边,带权边等区别。
边的通常使用两个端点代表,图的表示一般通过邻接链表或邻接矩阵。
图的搜索
图的一大问题就是图的搜索,这是图的基本算法。总体上分为广度优先和深度优先算法。
广度优先: 通常解决两点间的最短距离问题,算法的本质有点像“每次都选最好的”
深度优先:有点像人走迷宫,选择一个点,然后有路就会一直走下去,遇到死路退回,继续走。
深度优先每个顶点可记录两个属性,v.d表示第一经过v的时间,v.f表示返回时经过v的时间。
深度优先可以将图化为树,将边分为树边,前向边,后向边,横边。
深度优先是对图的一种重构。
参考: http://blog.csdn.net/mcgrady_tracy/article/details/12450469
拓扑排序
无回路的图中,将每个顶点排序,使得该图没有指向后面的边。可应用的环境,比如:一堆事件需要做,但是洗锅需要在炒菜之前做,对这些事件进行排序。
想出的算法:遍历图,将图中没有前置节点的顶点取出,并删除和该点有关的所有边,先取出的顶点排在前面。
缺点:复杂度高,需要删边遍历查找等操作。
深度优先算法:将图深度优先遍历,记录v.f,根据v.f由大到小进行排序。
思想:意思就是每次都取v.f最大的,无环图中,父亲的v.f一定比儿子的v.f大,所以v.f最大的一定没有父亲。
参考:http://blog.csdn.net/liwen_7/article/details/7298736
强连通分量
在图中,环的存在对图的影响比较大,所以经常将环缩成一个点,能缩成一个点的叫做强连通分量,定义是强连通分量中的点任意两两可达。
想出的算法:深度搜索图,将后向边(回边)包含的顶点进行缩点,同时处理缩点后的边的关系。
缺点:复杂度高,没缩一个点需要处理边的更换。
Kosaraju算法:利用了图G和他的反土GT,将G进行深度优先,并排序(类是与拓扑排序,虽然存在回边的情况)。在GT图中,按照G图的拓扑顺序进行深度优先搜索,此时产生的树都是强连通分量。
证明:假设在GT图中,顶点v搜索到u。那么在G图中必定存在u到v的边,假如u、v不在同一个强连通分量中,存在两种情况(深度先搜索v,那么v.f