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]\)得来的。
因此找同余最短路,可以找到答案的集合。