zoukankan      html  css  js  c++  java
  • 算法导论图论广度优先搜索及课后题答案

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

  • 相关阅读:
    PHP IIS SPY
    Java 教程整理:基础、项目全都有
    14门Linux课程,打通你Linux的任督二脉!
    给缺少Python项目实战经验的人
    Spark 简介与安装部署
    仿OpenStack开发云计算管理软件”--熟悉开发环境
    如何利用《C++ Primer》学习C++?
    J2SE核心开发实战(二)——字符串与包装类
    J2SE核心开发实战(一)——认识J2SE
    pygame开发PC端微信打飞机游戏
  • 原文地址:https://www.cnblogs.com/inpeace7/p/2454996.html
Copyright © 2011-2022 走看看