Note(读书笔记)

  首先在算法书的选择上,选择的是李煜东所著的《算法竞赛进阶指南》这本书,因为参加了学院的ACM竞赛实验室,这本书对本人的影响也很深,它涵盖了竞赛中大部分的算法,如基本算法二分、倍增、前缀和,简单的数据结构堆、字典树,DFS、BFS,博弈论,线段树、树状数组,动态规划、图论。仔细研究过的算法只是其中的一部分,最熟悉的就是图论部分了。
  图论中讲了很多算法,比如最短路、最小生成树、二分图、tarjan算法、网络流等。学习完这些,最让人印象深刻的算法就是tarjan算法,tarjan算法是计算机科学家Robert Tarjan提出的可以在线性时间内求出无向图的割点与桥,以及双连通分量。其实tarjan算法的本质是在深度优先搜索的基础上,通过设置时间戳、追溯值等操作避免了重复遍历结点,得出相关的值。Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。搜索时,把当前搜索树中未处理的节点加入一个堆栈,回溯时可以判断栈顶到栈中的节点是否为一个强连通分量。Tarjan算法有点类似于基于后序的深度遍历搜索和并查集的组合,充分利用回溯来解决问题。
  但是这次笔记主要是复习一下网络流的Dinic算法,网络流指的是一张有向图中每条边都有一个权值,为边的容量,在不超过容量限制的前提下,从源点S到汇点T,流会从S产生,最终归于汇点。Dinic算法是解决网络流的最大流问题,Dinic算法是典型的增广路算法,与其相对的还有预留推进算法,如ISAP。Dinic算法的思路是这样的:每次都不停地用BFS来构造“层次图”,然后用“阻塞流”来增广。什么是层次图呢?假设在残余网络中,起点到结点u的距离是dis(u),那么dis(u)就是结点u的“层次”。只保留每个点出发到下一层次的弧,就得到了一张层次图,其中还增加了众多剪枝。Dinic算法的时间复杂度的理论上界是O(N*N*M)(N是结点数,M是边数),但实际上Dinic算法比这个理论上界好得多。对于二分图最大匹配这样的特殊图,时间复杂度是O(N0.5*M)。可以处理104到105规模的网络。

你可能感兴趣的:(算法分析)