1.BFS及其运用

引言

BFS 是求解不带权有向图最短路的最高效做法。
它与 DAG 最短路的动态规划算法,共同构成最短路唯二的线性时间复杂度算法。
扩展:0-1 BFS、多源点 BFS。

  • 0-1 BFS:
    因为队列里面不降,且极差为\(1\),所以用deque,边权为\(0\)加在队头,否则加在对尾。

练习

(NCPC 2017)

  • 题意
    有 n 种性格,每个性格由 k 个 01 字符组成,
    1 表示具有某种属性,0 表示不具有。
    定义两种性格 a,b 的差异为 a 具有某种属性而 b 不具有,
    或 b 具有某种属性而 a 不具有的属性个数。
    现在请你自己定义一种性格,赋予每种属性的值,使得和其
    他性格的差异最小的一个尽可能大。
    n ≤ 10^5, k ≤ 20。

  • 思路
    \(k\)很小,把每一种性格状态一个\(\le 2^k\)的点。每个点向改变一个属性的点连边。从\(m\)个点开始bfs,每个点第一次被bfs到的距离即到\(m\)个点中的最短距离,找最短距离最长的即可。

补图最短路,HDU 5876

- 题意
边权为\(1\),求补图最短路。

  • 思路
    用BFS,好处是每个点只会被更新(入队)一次。
    关键是边很多,每次队顶找边很慢\(O(n)\),将入过队的点存入一个set里,每次直接找,原图没有连边会从set里面删去,其余的也是原图边的复杂度。

2.Floyd 及其应用

引言

Floyd 算法用于求任意两点最短路,对于图没有任何限制,
允许负权边,只要没有负环。
Floyd 算法时间复杂度 \(O(n^3)\) ,常数非常小。

图的最小环

给定一个\(n\le 500\)个点的无向图,每条边有边权(大于 0)。
求对每一节点,包含该点的最小环长是多少。

  • 最短路径树
    构造最短路径树,枚举非树边,复杂度\(O(n^3)\)

3.Dijkstra 的应用

重建铁路

  • 题意
    某王国由 n 个城市和 m 条双向道路构成,每条道路有相应
    的通行时间。
    该王国首都为 1 号城市,该城市和某些城市间还连有 k 条
    铁路,每条铁路有相应的通行时间。
    现在为了节省运营成本,问最多能去掉多少条铁路,使得首
    都到其他城市的最短距离不变。

  • 思路
    最短路径树,dj过程中优先选公路。答案是非树边中铁路的个数。

不定方程

  • 思路
    找到所有\(r\),所有%a[1]=r的方案即为%a[1]=r的最短路径(\(dis[i]\))加上若干个\(a[1]\)得来的。
    因此找同余最短路,可以找到答案的集合。

收费站