算法导论-----图论-----广度优先搜索及课后题答案

广度优先搜索(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,与题意不符

posted on 2012-04-18 11:15  Inpeace7  阅读(939)  评论(0编辑  收藏  举报

导航