图
一、 基本定义与应用
图:由结点集合V和边集合E构成,其中每条边与两个结点相交。
有向图可以表示不对称的关系
图的例子:运输网络,通信网络,信息网络,社会网络,依赖网络。
路径与连通性:存在一条从u到v的路径,称一个无向图是连通的
如果对每两个结点u与v,都存在一条从u到v的路径和一条从v到u的路径,我们说一个有向图是强连通的。
树:一个无向图如果是连通的,且不包含一个圈,我们就说它是一颗树。
树是最简单的连通图,删除树中的任意一条边将使得它不再连通。
命题3.1 每棵n个结点的树恰好由n-1条边。
定理3.2 设G是具有n个结点的无向图,下面任意两个语句都可以推出第三个语句。
(i)G是连通的
(ii)G不包含一个图
(iii)G有n-1条边。
二、图的遍历
s-t连通性问题也可以叫做迷宫求解问题。
1 宽度优先搜索
确定s-t连通性最简单的算法——宽度优先搜索(BFS)
定理3.3 对每个j≥1,由BFS产生的层 Lj 恰好由所有到s距离为j的结点组成,存在一条从s到t的路径,当且仅当t出现在某个层中。
(层 Lj 恰好是所有到s结点距离为j的结点的集合)
(BFS不仅确定了s可以达到的结点,也计算了他们的最短路径)
定理3.4 设T是一颗宽度优先搜索树,设x和y是T中分别属于层 Li 和 Lj 的结点,并且设(x,y)是G的一条边,那么i与j至多差1。
探查一个连通分支:
从始点s可达的结点,将把这个集合R看作G的包含s的连通分支。(可回答s-t连通性问题)
定理3.5 在算法结束产生的集合R恰好是G的包含s的连通分支。
2 深度优先搜索
探查方式:尽可能深的前进并且只有必要的时候才撤退。
DFS——一般性分支扩张算法的实现方式。可用递归形式表述。
命题3.6 对于给定的递归调用DFS(u),在这次激活和这个递归调用结束之间呗标记为“Exprored”的所有的结点都是u在T中的后代。
定理3.7 设T是一颗深度优先搜索树,x与y是T中的结点,且(x,y)是G中不属于T的一条边,那么x或y之中一个是另一个的祖先。
定理3.8 对图中任两个结点s与t,它们的连通分支或者相等, 或者不相交。
三、 用优先队列与栈实现图的遍历
1 图的表示
图的两种表示方式:邻接矩阵与邻接表(稀疏图更有效)。
定理3.10 一个图的邻接矩阵表示需要O(n2)的空间,而邻接表表示只需要O(m+n)的空间。
2 队列与栈
队列:先进先出 ——适用于BFS
栈:后进先出——适用于DFS
3 宽度优先搜索的实现
BFS(s):
置Discovered[s] = true 且对所有其他的v,Discovered[v] = false
初始化L[0]由单个元素s构成
置层计数器i=0
置当前的BFS树T=Φ
While L[i] 不空
初始化一个空表L[i+1]
For 每个结点u∈L[i]
考虑每条关联到u的边(u,v)
if Discovered[v] = false then
置Discovered[v] = true
把边(u,v)加到树T上
把v加到表L[i+1]
endif
endfor
层计数器++
endwhile
定理3.11 如果图是由邻接表表示给出的,BFS算法的上述实现将以O(m+n)时间(即以输入规模的线性时间)运行
4 深度优先搜索的实现
DFS(s):
初始化S为具有一个元素s的栈
While S非空
从S中取一个结点u
if Explored[u]=false then
置 Explored[u] = true
for 每条与u关联的边(u,v)
把v加到栈 S
Endfor
Endif
Endwhile
定理3.12 上述算法在下面的意义上实现DFS:它按照与递归的DFS过程恰好相同的次序(除了每个邻接表是按照相反的次序处理之外)访问结点。
定理3.13 如果图是由邻接表表示给出的,那么上述DFS算法的实现将以O(m+n)时间(即输入规模的线性时间)运行。
四、 二分性测试:宽度优先搜索的一个应用
二部图:是一个图,其结点集V可以用下述方式划分成集合X与Y,每条边的一端在X中而另一端在Y中。
1 问题
定理3.14 如果一个图是二部图,那么它不可能包含一个奇圈。
问题:确定一个图是二部图。
2 设计算法
给结点着色,如结点s为红色,则与s相邻的结点必须着蓝色
如果存在一条边两端颜色相同,则G不为二部图
BFS —— 一层为蓝一层为红。
3 分析算法
定理3.15 设G是一个连通图,令L1,L2,……是由始于结点s的BFS所产生的层,那么下面两件事一定恰好成立其一:
(i)G中没有边与同一层的两个结点相交,在这种情况下G是二部图,其中偶数层的结点可以着红色,奇数层结点可以着蓝色。
(ii)G中有一条边与同一层的两个结点相交,在这种情况下,G包含一个奇数长度的圈,且因此不可能是二部图。
五、有向图中的连通性
1 有向图的表示
邻接表
2 图搜索算法
与无向图类似,可使用BFS、DFS
3 强连通性
命题3.16 如果u和v是相互可达的,v和w是相互可达的,那么u和w也是相互可达的。
命题3.17 对有向图中的任何两个结点s和t,它们的强连通分支或者相等,或者不相交。
4 有向无圈图与拓扑排序
无向图没有圈——树
有向图没有圈——有向无圈图(DAG)
1) 问题
定理3.18 如果G有一个拓扑排序,那么G是一个DAG。
**问题:**每个DAG都有一个拓扑排序吗?怎样有效找到一个。(将证明对任务集上的任意五圈的优先关系,存在一个有效计算的执行任务的次序)。
2) 设计与分析算法
命题3.19 在每个DAG中,存在一个没有输入边的结点。
定理3.20 如果G是一个DAG,那么G有一个拓扑排序。
拓扑排序:
计算G的拓扑排序:
找到一个没有进入边的结点v并且将它排在第一
从G中删除v
递归计算G-{v}的拓扑排序并把这个序接在v的后面