L22 BFS and DFS
Outline:
BFS
skeleton
证明:
BFS树
应用
DFS
- s → all
Ref:
- 算法设计与分析(Algorithm design and analysis) by 黄宇
BFS
skeleton
BFS-WRAPPER(G)
1
2
3
4
5foreach node v in G do
v.color := WHITE; v.parent := null; v.dis := +∞;
foreach node v in G do
if v.color = WHITE then
BFS(v);BFS(G)
1
2
3
4
5
6
7
8
9
10
11
12
13
14Initialize an empty queue queNode;
v.color := GRAY;
v.dis := 0;
queNode.ENQUE(v);
while queNode != empty do
w := queNode.DEQUE();
foreach neighbor x of w do:
if x.color := WHITE then
x.color := GRAY;
x.parent := w;
x.dis := w.dis + 1;
queNode.ENQUE(x);
<processing of node w>;
w.color := BLACK;
证明:
变量
记源点
引理5.1 对于有向或无向图
, 对任意边 , 有 .证明:
如果源点
到 可达, 则由于 的存在, 到 同样可达. 所以 到 最短路径长度必然不超过任意一条 到 的路径长度(包括 到 再到 这条路径), 所以 . 若 到 不可达, 则 , 不等式同样成立(当然,若 到 也不可达,此时是 ,同样成立).引理5.2 从节点
开始BFS, 在遍历结束时, 对每个可达结点 , 有 .证明:
采用数学归纳法,对队列上的操作个数归纳, 即证明: 无论队列上执行了多少个操作, 该不变式总是成立: 对于任意
, .初始情况是队列执行第一个操作, 即将源点
放入队列中. 此时 . 对于其他任意节点 , . 所以初始情况下结论成立.由于出队操作对结论没有影响( 出队不会更改
), 只需要关注入队操作. 假设在处理节点 时, 发现白色邻居 . 根据归纳假设, 有 . 对于 , 有: $$ $$由于
的值一经赋值后不再变化. 所以我们通过归纳法证明了对每个节点 , 有
为了证明相等关系的另一半
, 首先要对BFS过程进行更细致的刻画.引理5.3 假设在BFS过程中, 队列中的元素为
( 是队头, 是队尾 ). 我们有: ( ) , 证明:
采用数学归纳法,对队列上的操作归纳. 初始情况下, 队列中只有源点
, 结论显然成立. 下面要证明队列任意执行一个操作(出队或入队), 上述结论总是成立.假设队头元素
出队, 则 成为新的队头元素. 根据归纳假设, 有从
到 的所有元素的小于等于关系依然成立. 所以执行一个出队操作后, 要证明的结论保持成立.假设有一个新元素
入队, 此时必然从队首取出一个节点进行处理, 记为 . 在处理 时, 我们发现了白色邻居 并将它放到队列尾部. 此时 . 在 出队前的时刻, 是队头, 是队列中的第二个元素, 所以 . 根据上面的分析, 有 .在
出队之前, 未入队时, 是队头, 是队尾. 同样根据归纳假设, 有 对于队列中其他元素而言, 不等关系未受影响.综上, 基于归纳法我们证明了, BFS过程中的任意时刻:
定理5.1 假设从图
中的源点 开始对整个图完成BFS, 则对任意节点 , , 且从 到 由TE组成的路径就是 到 的最短路径(不一定是唯一的最短路径)证明:
采用反证法, 假设存在一些节点, 它们的dis值不等于源点到它们的最短路径值. 在这些节点中, 取源点到其距离最短的节点, 记为
(显然 不可能为 ). 根据引理5.2, 有 . 注意 到 必然可达, 否则 考察
到 的最短路径. 记 为该路径上在 前面的节点, 则 . 根据选取 的特定方式, 有 (易证). 由此, 有: 下面考察节点 刚从队头出队的时刻. 此时节点 可能有三种颜色.- 如果
为白色, 则根据BFS框架, 将赋值 , 这与 矛盾 - 如果
为灰色,则记它作为节点 的白色邻居被放到队尾, 且 . 由于 比 更早离开队列, 所以根据引理5.3, 有 , 这与 矛盾 - 如果
为黑色, 则在 之前它已离开队列, 所以 , 这与 矛盾
证毕.
- 如果
BFS树
对于边
有向 | 无向 | |
---|---|---|
TE | 同左 | |
BE | nil | |
DE | nil | nil |
CE |
有向图
TE: 当遍历节点
时,发现其白色邻居 , 则 为TE. 在一个连通片内所有TE组成的子图连通且无环且包含了该连通片中所有节点. 如果忽略所有边的方向, 则这些TE组成当前连通片的一棵生成树,称为"BFS树"BE: 当遍历节点
时,发现其黑色邻居 , 且 是 在BFS树中的祖先节点, 则 为BE. 对于BE , 有 .DE: BFS不可能出现DE。反证假设
为DE,那么考察在节点 刚出队列,即将处理它的所有邻居的时刻, 节点 的情况:- 节点
不可能是白色,否则 为TE - 节点
不可能为灰色, 因为在此时 刚出队列, 而若 为灰色(正在队列中), 这和 是 在遍历树上的祖先节点矛盾 - 节点
不可能是黑色, 在 节点 刚出队的时刻, 如果 节点 已经结束遍历, 这同样和 是 在遍历树上的祖先节点矛盾
- 节点
CE: 当遍历节点
时,发现其灰色或者黑色邻居 , 且 不是 的祖先节点( 前面关于DE的讨论证明了必然不可能是子孙节点 ), 则 为CE. 对于CE, 有 - 与DFS类似, CE同样可能存在于两个不同的BFS树之间
无向图
- TE: 与有向图的情况类似, 当遍历节点
时,发现其白色邻居 , 则 为TE. 对于TE , 有 . 所有TE组成(当前连通片的)BFS遍历树, 我们为每条TE进行定向, 其方向就是遍历推进的方向. - BE: 不存在(证明易)
- DE: 不存在(证明易)
- CE: 当遍历节点
时,发现其灰色邻居 (前面关于BE和DE的讨论证明了 不可能是 的祖先或子孙节点), 则 为CE. 对于CE, 有 或 - 注意, 此时节点
不可能是白色,否则 为TE; 节点 不可能是黑色, 否则由于无向边 的存在, 在处理 时, 必然已处理过 , 此时的边 是二次遍历,直接被剔除, 不做处理.
- 注意, 此时节点
- TE: 与有向图的情况类似, 当遍历节点
推论5.1, 对于BFS过程中的CE
,- 无向图
或 - 有向图
证明:( 书上有图)
对于有向图的CE
,我们考察 最大可以比 大多少. 注意, 节点 发现得越晚, 越大. 由于图中有边 的存在, 所以最迟将节点 出队列时, 必将访问节点 . 所以 对于无向图的CE
, 当处理 时, 根据前面的讨论, 只能是灰色, 即 在队列中. 根据引理5.3, 有 . 所以 或- 无向图
应用
二部图
给定无向图
(等价于二着色问题)
- 发现TE,推进着色; 发现非TE,检查着色
- DFS也可以
k度子图
给定无向图
- 对于BFS中的点v,若v.d < k( d为v的度数 ), 则v的邻居d--;
- DFS也可以
DFS
s → all
有向图G,问是否存在点s,s到所有点可达?
“可达性”可使用SCC,因为SCC是可达性的等价类。求出G的收缩图后,又由于收缩图是有向无环图。 则检查每个顶点,若存在至少两个顶点出度为0,则不存在; 若仅存在一个出度为0的顶点,则从该顶点出发遍历
对于“all → s”,只需把图转置