算法导论-----图论-----广度优先搜索及课后题答案
广度优先搜索(O(V+E))
1.白色:未发现
灰色:发现和未发现之间
黑色:发现
2.颜色color[u]中
父母π[u]中
顶点源点之间的距离d[u]
队列Q
3.BFS(G,s)
{
For each vertex u 属于V[G]-{s}
Do color[u]=white
d[u]=无穷
π[u]=NIL
color[s]=gray;
d[s]=0;
π[s]=NIL;
Qß0
Enque(Q,s)
While Q!=空
{
Do ußdeque(Q)
For each v属于adj[u]
Do if color[v]=white
Then color[v]=gray;
d[v]=d[u]+1;
π[v]=u;
enqueue(Q,v);
color[u]=black;
}
}
4.设G=(V,E)是一个有向或无向图,s属于V是G的一个顶点,则对任意边(u,v)属于V有:
σ(s,v)<= σ(s,u)+1(σ为最短路径函数,此定理及以下的定理边权都为单位长度)
5. 设G=(V,E)是一个有向或无向图,s属于V是G的一个顶点,BFS从一顶点s执行,在执行终止时,对于每个顶点v,BFS所计算出来的d[v]值满足d[v]>σ(s,v)
6.假设过程BFS在图G=(V,E)上执行的过程中,队列Q包含顶点<v1,v2,…,vr>其中v1是队列的头,vr是队列的尾则d[vr]<=d[v1]=1 且 d[vi]<=d[vi+1],i=1,2,…,r-1
7.顶点被插入队列时,d是随着时间单调增加的
假设在bfs过程中,vi,vj插入队列,vi先于vj入队,那么当vj入队时,有d[vi]<d[vj]
8.广度优先搜索的正确性
设G=(V,E)是一个有向或无向图,s属于V是G的一个顶点,从s、开始运行。那么在BFS运行的过程中可以发现顶点d可达的每一个顶点,在运行终止时,对所有的v属于V,都有d[v]=σ(s,v),此外任意从s可达的顶点v!=s,从s到v的最短路径之一是从s到π(v)的最短路再加上(π[v],v)
9.广度优先树
过程BFS在搜索的同时,建立了广度优先树
对于图G=(V,E)及给定的源顶点s,可以形式化定义其前趋子图Gπ=(Vπ,Eπ)
其中 Vπ={v属于V:π[v]!=NIL}并{s}
Eπ={(π[v] ,v): v属于Vπ-{s}}
10.当过程 BFS应用于某一有向图或无向图G=(V,E)时,同时构造π域,使得前趋子图
Gπ=(Vπ,Eπ)一棵广度优先树
11.下面过程将输出从s到v最短路径上所有的节点
print-path(G,s,v)
{
If v=s
Then print s
Else if π[v]=NIL
Then print "no path from" s "to " v "exist"
Else print-path(G,s, π[v])
Print v;
}
12.课后题22.2-6 好选手 差选手
(1)二分图的充要条件,无环一定第二分图;有环的话,若环的顶点是偶数,是二分图;否则不是。
(2)
BFS(G,s)
{
For each vertex u 属于 V[G]-{s}
Do color[u]=white
d[u]=正无穷
π[u]=NIL
color[s]=gray
d[s]=0;
π[s]=NIL
Q=0;
Enqueue(Q,s)
While(Q!=0)
{
Do u=dequeue(Q)
For each v 属于adj[u]
If(color[v]=gray && (d[v]+d[u])%2==0) return false;
If color[v]=white
Then color[v]=gray;
d[v]=d[u]+1
π[v]=u
enqueue(Q,v)
color[v]=black
}
Return true;
}
13.课后题22.2-7
从任意起点开始,运行一次BFS,得到一个最远点d1,d1即为直径的一点
再运行一次BFS,得到一个最远点d2,则d1~d2为树的直径
为什么这样是对的?
(1)证明d1是树直径的一点
a) 若s在直径d1,d2上,则最后一个点必能搜到d1或d2;因为若搜到最后一个点为v,则直径为vd2,与题意不符
b) 若s不在直径d1,d2上,BFS搜到的最远点为v,d1-d2为直径,根据连通图的性质,
路径s-v当中必有一点t1,与路径d1-d2相连
.
根据d1-d2直径定义 d1d2=d2t2+t2d1,且t2d1>=t2t1+t1v,否则直径为d2-t2-t1-v
根据v是BFS搜到的最远点,t1v>=t1t2+t2d1,最远点为d1
根据两个不等式可得
t1t2=0
t1v=t2d1
(2)通过d1进行BFS,最后搜到的点必为d2
因为若搜到最后一个点为v,则直径为vd1,与题意不符