书签 分享 收藏 举报 版权申诉 / 43
上传文档赚钱

类型图的遍历深度优先遍历和广度优先遍历课件.ppt

  • 上传人(卖家):ziliao2023
  • 文档编号:5669830
  • 上传时间:2023-05-01
  • 格式:PPT
  • 页数:43
  • 大小:252.50KB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《图的遍历深度优先遍历和广度优先遍历课件.ppt》由用户(ziliao2023)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    遍历 深度 优先 广度 课件
    资源描述:

    1、20、图的遍历深度优先遍历和广度、图的遍历深度优先遍历和广度优先遍历优先遍历 掌握图的深度优先和广度优先遍历掌握图的深度优先和广度优先遍历的性质和方法,以及基于邻接矩阵和的性质和方法,以及基于邻接矩阵和邻接表存储结构的递归和非递归的算邻接表存储结构的递归和非递归的算法实现法实现目目 录录20.1 概述概述20.2 深度优先遍历深度优先遍历20.3 深度优先遍历的性质深度优先遍历的性质 20.4 广度优先遍历广度优先遍历20.5 广度优先遍历的性质广度优先遍历的性质2020、图的遍历图的遍历 从这节起,我们介绍图的一些重要操作的实现,从这节起,我们介绍图的一些重要操作的实现,包括遍历、拓扑排序、

    2、关键路径等。另有一些重包括遍历、拓扑排序、关键路径等。另有一些重要操作,如最短路径问题、最小生成树问题,由要操作,如最短路径问题、最小生成树问题,由于主要难点在于算法,所以我们安排在后面的算于主要难点在于算法,所以我们安排在后面的算法设计章节中介绍。法设计章节中介绍。图的遍历与树的遍历一样具有十分重要的作用,图的遍历与树的遍历一样具有十分重要的作用,图的许多其他操作(算法)都与遍历相关。图的许多其他操作(算法)都与遍历相关。20.1 20.1 概述概述 图的遍历的含意是,图的遍历的含意是,从图中某结点出发,按某既定方式从图中某结点出发,按某既定方式访问图中各个可访问到的结点,使每个可访问到的结

    3、点恰被访问图中各个可访问到的结点,使每个可访问到的结点恰被访问一次。访问一次。图的遍历方式有两种:深度优先与广度优先方式,分别图的遍历方式有两种:深度优先与广度优先方式,分别对应于树的先根遍历与层序遍历。对应于树的先根遍历与层序遍历。树中不存在回路,但图中可能有回路。因此,当沿回路树中不存在回路,但图中可能有回路。因此,当沿回路进行扫描时,一个结点可能被扫描到多次,可能导致死循环。进行扫描时,一个结点可能被扫描到多次,可能导致死循环。为了避免这种情形,在遍历中,应为每个结点设立一个访问为了避免这种情形,在遍历中,应为每个结点设立一个访问标志,每扫描到一个结点,要检查它的访问标志,若标志为标志,

    4、每扫描到一个结点,要检查它的访问标志,若标志为“未访问未访问”,则按正常方式对其进行处理(如访问或转到它,则按正常方式对其进行处理(如访问或转到它的邻接点等),否则放过它,扫描下一个结点。的邻接点等),否则放过它,扫描下一个结点。访问标志的设置有两种方法:访问标志的设置有两种方法:在描述图结的记录中增设一个访问标志位。在描述图结的记录中增设一个访问标志位。这种方法的优点是,访问这种方法的优点是,访问“访问标志访问标志”的方法与的方法与访问结点的方法一致。如果访问标志需要与图结访问结点的方法一致。如果访问标志需要与图结构同生命期,则这种方法比较合适。但是,若访构同生命期,则这种方法比较合适。但是

    5、,若访问标志要重复使用,就必须先重新初始化访问标问标志要重复使用,就必须先重新初始化访问标志。如果图结点的存储不利于顺序访问,这往往志。如果图结点的存储不利于顺序访问,这往往也是个遍历问题!也是个遍历问题!另设一个另设一个“访问数组访问数组”,令它的每个元素对,令它的每个元素对应于一个图结点访问标志。这种方法的访问标志应于一个图结点访问标志。这种方法的访问标志很容易多次初始化很容易多次初始化。从图中某一结点出发,一趟只能遍历到它所在的极从图中某一结点出发,一趟只能遍历到它所在的极大连通分量中的结点,要想遍历到图中各结点,需大连通分量中的结点,要想遍历到图中各结点,需进行多趟遍历(每趟遍历一个极

    6、大连通分量)。该进行多趟遍历(每趟遍历一个极大连通分量)。该过程可描述为:过程可描述为:for(图中每个结点图中每个结点v)if(v尚未被访问过尚未被访问过)从从v出发遍历该图出发遍历该图;下面只考虑从一点出发遍历,因此有可能下面只考虑从一点出发遍历,因此有可能会出现遍历不到的点。即那些初始点无路会出现遍历不到的点。即那些初始点无路径可达的点,是遍历不到的。径可达的点,是遍历不到的。20.2 20.2 深度优先遍历深度优先遍历 (一一)遍历规则遍历规则 从图中某结点从图中某结点v0出发,出发,深度优先遍历(深度优先遍历(DFS:Depth First Search)图的规则为:图的规则为:访问

    7、访问v0;对对v0的各个出点的各个出点v01,v02,v0m,每次从它,每次从它们中按一定方式(也可任选)选取一个未被访问过们中按一定方式(也可任选)选取一个未被访问过的结点,从该结点出发按深度优先遍历方式遍历。的结点,从该结点出发按深度优先遍历方式遍历。显然,因为我们没有规定对出点的遍历次序,显然,因为我们没有规定对出点的遍历次序,所以,图的深度优先遍历结果一般不唯一所以,图的深度优先遍历结果一般不唯一。例如,对图例如,对图 20 1给出的有向图与无向图,一些遍给出的有向图与无向图,一些遍历结果(结点访问次序)为:历结果(结点访问次序)为:左图:从左图:从1出发:出发:1,2,4,5;或;或

    8、1,5,2,4 从从2出发:出发:2,1,5,4;或;或2,4,1,5 右图:从右图:从a出发:出发:a,b,c,d;或;或a,b,d,c;1254abcd图图20 1一个有向图(左)和无向图一个有向图(左)和无向图 1.一般算法 下面考虑深度优先遍历的递归实现的一般方法(存储下面考虑深度优先遍历的递归实现的一般方法(存储结构无关)。结构无关)。图的深度优先遍历与二叉树的前序遍历相似。不同之图的深度优先遍历与二叉树的前序遍历相似。不同之处有:二叉树每个结点至多有两个可达邻接点处有:二叉树每个结点至多有两个可达邻接点(左右儿子),而图的可达邻接点数目不定;(左右儿子),而图的可达邻接点数目不定;

    9、对二叉树,沿可达邻接点搜索时不会发生回绕,对二叉树,沿可达邻接点搜索时不会发生回绕,但对图,若不加特别控制,就有可能回绕。但对图,若不加特别控制,就有可能回绕。下面是图的深度优先遍历递归算法的一般性描述。下面是图的深度优先遍历递归算法的一般性描述。如果要另设一个数组作为访问标志,则该数组要在如果要另设一个数组作为访问标志,则该数组要在递归过程(函数)之外初始化为递归过程(函数)之外初始化为“未访问未访问”。(二)递归实现方法(二)递归实现方法long DFS(图图g,结点,结点v0)/图深度优先遍历递归算法。从结点图深度优先遍历递归算法。从结点v0出发,深度优出发,深度优先遍历图先遍历图g,返

    10、回访问到的结点总数,返回访问到的结点总数 int nNodes;/寄存访问到的结点数目寄存访问到的结点数目 访问访问v0;为为v0置已访问标志置已访问标志;nNodes=1;求出求出v0的第的第1个可达邻接点个可达邻接点v;while(v存在存在)if(v未被访问过未被访问过)nNodes=nNodes+DFS(g,v);求出求出v0的下个可达邻接点的下个可达邻接点v;return nNodes;12541 1 2 1 3 0 4 1 5 1 有向图访问标识数组访问标识数组visited1245输出数组输出数组resu例如从例如从1点深度优先遍历,先把点深度优先遍历,先把1设置访问标志,并置入

    11、输出数组设置访问标志,并置入输出数组resu,然后从邻接,然后从邻接矩阵的第一行,扫描各列,找到最近的邻接点矩阵的第一行,扫描各列,找到最近的邻接点2,将其设置访问标志,并进入输出数,将其设置访问标志,并进入输出数组,接着从邻接矩阵的组,接着从邻接矩阵的2行扫描,找到第一个构成边的点是行扫描,找到第一个构成边的点是1,检查访问标识数组,检查访问标识数组,发现发现1已经访问过,跳过,找第二个构成边已经访问过,跳过,找第二个构成边 的点的点4,设置访问标识,进入输出数组,设置访问标识,进入输出数组,再从邻接矩阵的第再从邻接矩阵的第4行扫描,寻找构成边的点,除行扫描,寻找构成边的点,除1外在无其他点

    12、,返回外在无其他点,返回2行,继续寻行,继续寻找,也无新点,返回找,也无新点,返回1,找到,找到5,将,将5置访问标志,进入输出数组,置访问标志,进入输出数组,1行再无其他新点,行再无其他新点,遍历结束,返回遍历元素个数为遍历结束,返回遍历元素个数为4。2 2邻接矩阵实现邻接矩阵实现 这里我们为了突出主题、简化问题,假定图是用一般的邻这里我们为了突出主题、简化问题,假定图是用一般的邻接矩阵存储,邻接矩阵用简单的二维数组表示(静态),用接矩阵存储,邻接矩阵用简单的二维数组表示(静态),用0和和1分别表示无边和有边。图结点用自然数编号。分别表示无边和有边。图结点用自然数编号。long DFS1(i

    13、nt gCNST_NumNodes,long n,long v0,char*visited,long*resu,long&top)/深度优先遍历图(递归)。图深度优先遍历图(递归)。图g为邻接矩阵,结点编号为为邻接矩阵,结点编号为 0n.返回实际遍历到的结点数目返回实际遍历到的结点数目 /visited是访问标志数组,调用本函数前,应为其分配空间是访问标志数组,调用本函数前,应为其分配空间并初始化为全并初始化为全0(未访问未访问)/resu为一维数组,用于存放所遍历到的结点的编号,调为一维数组,用于存放所遍历到的结点的编号,调用本函数前,应为其分配空间用本函数前,应为其分配空间 long nN

    14、odes,i;nNodes=1;resutop+=v0;/将访问到的结点依次存于将访问到的结点依次存于resu visitedv0=1;/为为v0置已访问标志置已访问标志 for(i=0;in;i+)/依次从依次从v0的各个出点出发,深度优先遍历图的各个出点出发,深度优先遍历图 if(gv0i!=0)/若若是边是边 if(!visitedi)/若结点若结点i未被访问过未被访问过 nNodes=nNodes+DFS1(g,n,i,visited,resu);/从从i起深度优先遍历图起深度优先遍历图 return nNodes;A A 如果不想让如果不想让visited或或top做为函数参数,也做

    15、为函数参数,也可以在函数中将其定可以在函数中将其定义为义为static型量。但是,型量。但是,这样的程序是不可再这样的程序是不可再入的,即函数再次被入的,即函数再次被调用时,调用时,static型的量型的量也不重新初始化,造也不重新初始化,造成错误!成错误!上面函数中的参数上面函数中的参数visited和和top实质上是中间变量,只是为实质上是中间变量,只是为了避免在递归调用时重新初始化而放在参数表中,造成使了避免在递归调用时重新初始化而放在参数表中,造成使用的不方便,为此,做个包装程序:用的不方便,为此,做个包装程序:long DFS1(int gCNST_NumNodes,long n,l

    16、ong v0,long*resu)char*visited;long top=0;visited=new charn;for(long i=0;in;i+)visitedi=0;long num=DFS1(g,n,v0,visited,resu,top);delete visited;return num;125412452b51d451a1c2e3f45对应的邻接表对应的邻接表图图 20 2有向图1 1 2 1 3 0 4 1 5 1访问标识数组访问标识数组visited输出数组输出数组resu地址起 终 权 信息链a1 2bb1 5c2 1dd2 4e3 5f4 1邻接表边PNodes 终

    17、点终点2作为下次的始点,作为下次的始点,由于由于1点已访问过,跳过,点已访问过,跳过,找到找到4,记标识,送输出,记标识,送输出,4有作为新的始点重复上有作为新的始点重复上述过程述过程 3邻接表深度优先遍历的实现深度优先遍历的实现 template long DFS2(TGraphNodeAL *nodes,long n,long v0,char*visited,long*resu,long&top)/深度优先遍历用邻接表表示的图。深度优先遍历用邻接表表示的图。nodes是邻接表的头数组,是邻接表的头数组,n为结点个数(编号为为结点个数(编号为0n)。)。/v0为遍历的起点。返回实际遍历到的结

    18、点的数目。为遍历的起点。返回实际遍历到的结点的数目。/visited是访问标志数组,调用本函数前,应为其分配空间并初是访问标志数组,调用本函数前,应为其分配空间并初始化为全始化为全0(未访问未访问)/resu为一维数组,用于存放所遍历到的结点的编号,调用本函为一维数组,用于存放所遍历到的结点的编号,调用本函数前,应为其分配空间数前,应为其分配空间 long nNodes,i;TGraphEdgeAL*p;nNodes=1;resutop+=v0;/将访问到的结点依次存于将访问到的结点依次存于resu visitedv0=1;/置置v0为为“已访问已访问”标志标志 p=nodesv0.first

    19、OutEdge;/求出求出v0的第一个出点的第一个出点p while(p!=NULL)if(!visitedp-endNo)/若若p未访问,则从未访问,则从p出发深度优先遍出发深度优先遍历历 nNodes=nNodes+DFS2(nodes,n,p-endNo,visited,resu,top);p=p-next;/令令p指向指向v0的下个出点的下个出点 return nNodes;与邻接矩阵的情况类似,也可以对该程序与邻接矩阵的情况类似,也可以对该程序“包装包装”,以隐蔽,以隐蔽visited和和top。(三三)非递归实现方法非递归实现方法1一般方法一般方法 下面考虑深度优先遍历的非递归实现

    20、的一般方法(存储下面考虑深度优先遍历的非递归实现的一般方法(存储结构无关)。结构无关)。图的深度优先遍历的非递归实现,仍然与二叉树的前序图的深度优先遍历的非递归实现,仍然与二叉树的前序遍历非递归实现相似。不同之处有:二叉树每个结点至遍历非递归实现相似。不同之处有:二叉树每个结点至多有两个可达邻接点(左右儿子),而图的可达邻接点数多有两个可达邻接点(左右儿子),而图的可达邻接点数目不定,因此,当结点重新出现在栈顶时,不能一定出栈,目不定,因此,当结点重新出现在栈顶时,不能一定出栈,而是要根据它的各出点是否都已被访问过来决定(是则出而是要根据它的各出点是否都已被访问过来决定(是则出栈);对二叉树,

    21、沿可达邻接点搜索时不会发生回绕,栈);对二叉树,沿可达邻接点搜索时不会发生回绕,但对图,若不加特别控制,就有可能回绕。但对图,若不加特别控制,就有可能回绕。long DFS_NR(图图g,结点,结点v0)/图深度优先遍历非递归算法。从结点图深度优先遍历非递归算法。从结点v0出发,深度优出发,深度优先遍历图先遍历图g,返回访问到的结点总数,返回访问到的结点总数 int nNodes;/寄存访问到的结点数目寄存访问到的结点数目 访问访问v0;为为v0置已访问标志置已访问标志;v0进栈进栈S;nNodes=1;求出求出v0的第的第1个可达邻接点个可达邻接点v;深度优先遍历非递归算法的一般性描述。深度

    22、优先遍历非递归算法的一般性描述。while(栈栈S不空不空)v=栈栈S顶部元素;顶部元素;求求v的下个未访问过的出点的下个未访问过的出点i;访问访问i;为为i置已访问标志置已访问标志;i进栈进栈S;nNodes+;if(v已无未被访问过的出点已无未被访问过的出点)出栈;出栈;return nNodes;上面的伪码描述与具体的数据结构无关。下面的程序分别给上面的伪码描述与具体的数据结构无关。下面的程序分别给出了针对邻接矩阵与邻接表的算法模型。出了针对邻接矩阵与邻接表的算法模型。2邻接矩阵实现邻接矩阵实现long DFS1_NR(int gCNST_NumNodes,long n,long v0,

    23、long*resu)/深度优先遍历图深度优先遍历图(非递归)。图非递归)。图g为邻接矩阵,为邻接矩阵,结点编号为结点编号为0n.返回实际遍历到的结点数目返回实际遍历到的结点数目/resu为一维数组,用于存放所遍历到的结点的为一维数组,用于存放所遍历到的结点的 编号,调用本函数前,应为其分配空间编号,调用本函数前,应为其分配空间 long nNodes,i,v;long top;char*visited;long*s;visited=new charn;for(i=0;in;i+)visitedi=0;s=new longn+1;top=0;nNodes=0;resunNodes+=v0;/将访

    24、问到的结点依次存于将访问到的结点依次存于resu visitedv0=1;/为为v0置已访问标志置已访问标志 top+;stop=v0;while(top!=0)v=stop;for(i=0;in;i+)/寻找寻找v的下个未访问的邻接点的下个未访问的邻接点 if(gvi!=0)/若若是边是边 if(!visitedi)/若结点若结点i未被访问过未被访问过 resunNodes+=i;/将访问到的结点依次存于将访问到的结点依次存于resu visitedi=1;/为为i置已访问标志置已访问标志 top+;stop=i;/i进栈进栈 break;if(i=n)top-;/若若v已无未访问到的出点,

    25、则将其退栈已无未访问到的出点,则将其退栈/while return nNodes;下面给出初始结点为下面给出初始结点为1时,得进出栈的过程:时,得进出栈的过程:15224111进栈进栈,1出栈;出栈;2进栈,进栈,5进栈,进栈,5出栈,出栈,2出栈,出栈,1进栈,进栈,4进栈,进栈,4出栈,出栈,1出栈。出栈。遍历结果为遍历结果为 1,5,2,420.320.3深度优先遍历的性质深度优先遍历的性质 深度优先遍历有许多重要而有趣的性质,深度优先遍历有许多重要而有趣的性质,利用它们可以获得有关图的更多的信息。利用它们可以获得有关图的更多的信息。我们这里作一简单介绍。我们这里作一简单介绍。(一一)深

    26、度优先生成树与单源路径深度优先生成树与单源路径 在深度优先遍历中,如果将每次在深度优先遍历中,如果将每次“前进前进”(纵深)(纵深)路过的(将被访问的)结点和边都记录下来,就得路过的(将被访问的)结点和边都记录下来,就得到一个子图,该子图为以出发点为根的树,称为深到一个子图,该子图为以出发点为根的树,称为深度优先生成树。度优先生成树。如果从图的多个结点出发才能遍历到所有结点,则图的深度如果从图的多个结点出发才能遍历到所有结点,则图的深度 优先遍历树有多棵,从而构成森林,称为优先遍历树有多棵,从而构成森林,称为深度优先生成森林深度优先生成森林。显然,由图得到深度优先生成树,相当于对图显然,由图得

    27、到深度优先生成树,相当于对图“层次层次”化,化,使图中每个结点都有一个层次号。使图中每个结点都有一个层次号。此外,从此外,从v0出发深度优先遍历树,同时也产生出发深度优先遍历树,同时也产生v0到各结点的到各结点的路径。例如,图路径。例如,图 20 2(a)的出发点为的出发点为1的深度优先生成树如图的深度优先生成树如图 20 2(b).(a)有向图有向图(b)深度优先生成树深度优先生成树图图 20-2 深度优先遍历性质说明深度优先遍历性质说明1254361254361/122/53/47/86/119/10 (二二)时间戳时间戳 在遍历中,对每个结点在遍历中,对每个结点v,定义从,定义从第一次第

    28、一次“发现发现”(即第一次遇到,开始遍历)它的时刻为它的(即第一次遇到,开始遍历)它的时刻为它的发现发现时间时间,记为,记为S(v),定义遍历完,定义遍历完v的时刻为的时刻为v的的完成时完成时间间,记为,记为E(v)。这两种时间都称。这两种时间都称v的的时间戳时间戳。一般情一般情况下,用遍历中况下,用遍历中“路过路过”(包括回退)的结点数表(包括回退)的结点数表示时间。图示时间。图 20 2(b)中,结点旁边的数字中,结点旁边的数字“a/b”表表示对应结点的开始时间和完成时间分别为示对应结点的开始时间和完成时间分别为a和和b(针(针对对(a)的从的从1出发的深度优先遍历)。出发的深度优先遍历)

    29、。时间戳的差时间戳的差E(v)-S(v)可用在推算深度优先遍历的可用在推算深度优先遍历的进行情况,做为遍历的启发信息,指导遍历算法尽进行情况,做为遍历的启发信息,指导遍历算法尽快发现目标。快发现目标。(三三)遍历括号遍历括号 某结点某结点v的深度优先遍历括号定义为:的深度优先遍历括号定义为:(v X1 X2 Xm v)这里,这里,Xi为为v的出点中,可从的出点中,可从v出发直接访问到的出发直接访问到的各结点的遍历括号。各结点的遍历括号。i=1,m,m0。例如,图例如,图20 2(b)的结点的结点1的遍历括号为:按时的遍历括号为:按时间戳有间戳有 (1(2(4 4)2)(5(3 3)(6 6)5

    30、)1)遍历括号实质上是广义表,它完全描述了深度遍历括号实质上是广义表,它完全描述了深度优先遍历的过程及深度优先遍历生成树的结构,优先遍历的过程及深度优先遍历生成树的结构,可做为深度优先遍历生成树的串行化表达式。可做为深度优先遍历生成树的串行化表达式。20.420.4广度优先遍历广度优先遍历 (一一)图的广度优先分层图的广度优先分层 图的广度优先分层与图的广度优先遍历密切相图的广度优先分层与图的广度优先遍历密切相关。另外,在许多其他问题中,也涉及到图的广关。另外,在许多其他问题中,也涉及到图的广度优先分层。图的广度优先分层就是要识别出图度优先分层。图的广度优先分层就是要识别出图中每个结点属于的层

    31、次,即给每个结点编一个层中每个结点属于的层次,即给每个结点编一个层次号。但是,图本身是非层次结构,所以,一般次号。但是,图本身是非层次结构,所以,一般也无层次而言。然而,我们若只从某些关系也无层次而言。然而,我们若只从某些关系/角角度考虑问题,则就可对图分层了。度考虑问题,则就可对图分层了。分层时,分层时,应先确定一个或几个参考点,将它们的层号应先确定一个或几个参考点,将它们的层号指定为起始层(第指定为起始层(第1层)层)。下面给出以结点。下面给出以结点v0为参考为参考点的图的点的图的广度优先分层广度优先分层的定义(非过程化),这里的定义(非过程化),这里用用Level(v)表示结点表示结点v

    32、的广度优先分层的的广度优先分层的层号层号:n n 令令Level(v0)=1 n n 对任意的对任意的vv0,若存在,若存在v0到到v的通路,则令的通路,则令 Level(v)=1+MINu Level(u)|是图的边是图的边 否则令否则令Level(v)=可能在不同的路径中会有多个边到达,取其最短者,即可能在不同的路径中会有多个边到达,取其最短者,即层号低的那个。层号低的那个。例例 20 3 对图对图 20 1,广度优先分层情况为:,广度优先分层情况为:右图:从右图:从1出发分层:出发分层:层号为层号为1的结点:的结点:1 层号为层号为2的结点:的结点:2,5 层号为层号为3的结点:的结点:

    33、4 层号为层号为的结点:的结点:3 右图:从右图:从2出发分层:出发分层:层号为层号为1的结点:的结点:2 层号为层号为2的结点:的结点:1,4 层号为层号为3的结点:的结点:5 层号为层号为的结点:的结点:3 右图:从右图:从a出发分层:出发分层:层号为层号为1的结点:的结点:a 层号为层号为2的结点:的结点:b,d 层号为层号为3的结点:的结点:c 1254abcd (二二)图的广度优先遍历方法图的广度优先遍历方法 从结点从结点v0出发,广度优先遍历(出发,广度优先遍历(Breadth/Width First Search)图的方法是,按从)图的方法是,按从v0出发,对图的广度优先分层的层

    34、出发,对图的广度优先分层的层次号的大小次序访问结点,即先访问第一层上结点,然后访问次号的大小次序访问结点,即先访问第一层上结点,然后访问第二层上结点,第二层上结点,等等,同层上结点可按邻接点次序或任意。等等,同层上结点可按邻接点次序或任意。例如,图例如,图 20 1中的两个图的一些广度优先遍历次序如下。中的两个图的一些广度优先遍历次序如下。左图:从左图:从1出发广度优先遍历结果:出发广度优先遍历结果:1,2,5,4 左图:从左图:从2出发广度优先遍历:出发广度优先遍历:2,1,4,5 右图:从右图:从a出发广度优先遍历:出发广度优先遍历:a,b,d,c 从另一角度看,从从另一角度看,从v出发广

    35、度优先遍历,是先访问出发广度优先遍历,是先访问v,然后,然后,对任意结点对任意结点u,在访问了,在访问了u之后,对之后,对u的各可达点的访问,按距的各可达点的访问,按距u的距离(边数)大小次序进行。的距离(边数)大小次序进行。显然,若图的结点是无序的(即邻接点无次序关系),则显然,若图的结点是无序的(即邻接点无次序关系),则广度优先遍历次序也不是唯一的,但层次关系不颠倒。广度优先遍历次序也不是唯一的,但层次关系不颠倒。(三)算法实现 1.一般方法一般方法对于深度优先遍历,用递归方法描述是件自然的对于深度优先遍历,用递归方法描述是件自然的事,但广度优先遍历不然,使用递归描述反而会使问题复杂化,事

    36、,但广度优先遍历不然,使用递归描述反而会使问题复杂化,所以我们这里只讲非递归描述法所以我们这里只讲非递归描述法 广度优先遍历是一种分层处理,对这种分层处理,使用队广度优先遍历是一种分层处理,对这种分层处理,使用队列是自然的列是自然的。我们设立一个队列,任何时刻,均保证它满足下。我们设立一个队列,任何时刻,均保证它满足下列条件:列条件:队中元素是已访问过的结点的可达邻接点;队中元素是已访问过的结点的可达邻接点;队中元素是尚未被访问过的;队中元素是尚未被访问过的;队中元素按它们所处的层次的先后排列。队中元素按它们所处的层次的先后排列。这样,我们就可不断地每次从队中取出一个元素并访问之,这样,我们就

    37、可不断地每次从队中取出一个元素并访问之,然后再将该元素的尚未被访问过的邻接点进队,直至队空。然后再将该元素的尚未被访问过的邻接点进队,直至队空。图的广度优先算法伪码描述如下:图的广度优先算法伪码描述如下:long BFS(long BFS(图图g,g,结点结点v0v0)/在图在图g g中从中从v0v0出发按广度优先遍历方式遍历出发按广度优先遍历方式遍历g g,返回,返回遍历到的结点数目遍历到的结点数目 long nNodes=0;long nNodes=0;初始化队初始化队Q;Q;if if(v0v0存在)存在)v0 v0入入Q;Q;置置v0v0为已访问标志为已访问标志;while(Q whi

    38、le(Q不空不空)队队Q Q头元素出队并送头元素出队并送v;v;访问访问v;v;nNodes+;/nNodes+;/对已访问元素计数对已访问元素计数 求出求出v v的第一个可达邻接点的第一个可达邻接点w;w;while(w while(w存在存在)if(w if(w尚未被访问过尚未被访问过)w w入入Q;Q;置置w w为已访问标志为已访问标志;求求v v的下个可达邻接点的下个可达邻接点w;w;return nNodes;return nNodes;上面的算法描述是一般性的,并未涉及到具体的存贮结构。上面的算法描述是一般性的,并未涉及到具体的存贮结构。2.邻接矩阵实现邻接矩阵实现设图用邻接矩阵表

    39、示,则它的广度优先遍历算法如下。设图用邻接矩阵表示,则它的广度优先遍历算法如下。long BFS1_NR(int gCNST_NumNodes,long n,long v0,long BFS1_NR(int gCNST_NumNodes,long n,long v0,long long*nos)nos)/广度优先遍历(邻接矩阵):从广度优先遍历(邻接矩阵):从v0v0出发遍历用邻接矩阵表示出发遍历用邻接矩阵表示的图的图g g(共(共n n个结点)个结点)/将访问到的结点的编号存入将访问到的结点的编号存入nos(nos(其必须在外面分配其必须在外面分配n n个个longlong型型空间),返回遍

    40、历到的结点数目空间),返回遍历到的结点数目 long nNodes=0;long nNodes=0;long v,w,i;long v,w,i;char char*visited;visited;TQueueSqu Q(n+1);TQueueSqu Q(n+1);visited=new charn;visited=new charn;for(i=0;in;i+)visitedi=0;/for(i=0;i=0&v0=0&v0n)Q.QPush(v0);visitedv0=1;Q.QPush(v0);visitedv0=1;while(!Q.IsEmpty()while(!Q.IsEmpty()v

    41、=Q.QPop();v=Q.QPop();nosnNodes=v;/nosnNodes=v;/访问结点访问结点v v nNodes+;nNodes+;for(w=0;wn;w+)/for(w=0;wn;w+)/找找v v的各未访问的出点的各未访问的出点 if(gvw!=0)if(gvw!=0)if(!visitedw)if(!visitedw)Q.QPush(w);/v Q.QPush(w);/v的各未访问的出点进栈的各未访问的出点进栈 visitedw=1;visitedw=1;/while/while delete visited;delete visited;return nNodes;

    42、return nNodes;12541 2 3 4 5 1 0 1 0 0 1 2 1 0 0 1 0 3 0 0 0 0 1 4 1 0 0 0 0 5 0 0 0 0 0所示图的邻接矩阵所示图的邻接矩阵g1 1 2 1 3 0 4 1 5 1 有向图访问标识数组访问标识数组visited1254输出数组输出数组nos 145425 3邻接表实现 针对邻接表的算法为:template long BFS2_NR(TGraphNodeAL*nodes,long n,long v0,long*nos)/广度优先遍历(邻接表):从v0出发遍历用邻接表表示的图g(共n个结点)/将访问到的结点的编号存入

    43、nos(其必须在外面分配n个long型空间),返回遍历到的结点数目 long nNodes=0;TGraphEdge*p;char*visited;TQueuesSqu Q(n+1);visited=new charn;for(i=0;i=0&v0endNo)Q.QPush(p-endNo);visitedp-endNo=1;p=p-next /while/while delete visited;return nNodes;125412542b51d451a1c2e3f45对应的邻接表对应的邻接表图图 20 2有向图1 1 2 1 3 0 4 1 5 1访问标识数组访问标识数组visited

    44、输出数组输出数组nos地址起 终 权 信息链a1 2bb1 5c2 1dd2 4e3 5f4 1邻接表边PNodes 12 55 4420.520.5广度优先遍历的性质广度优先遍历的性质 与深度优先遍历类似,广度优先遍历也有许多有用的特性。与深度优先遍历类似,广度优先遍历也有许多有用的特性。(一一)广度优先生成树广度优先生成树 在广度优先遍历中,如果将每次在广度优先遍历中,如果将每次“前进前进”(纵深)路过的(纵深)路过的(将被访问的)结点和边都记录下来,就得到一个子图,(将被访问的)结点和边都记录下来,就得到一个子图,该子图为以出发点为根的树,称为该子图为以出发点为根的树,称为广度优先生成树

    45、广度优先生成树。这种。这种情况与深度优先遍历类似。情况与深度优先遍历类似。类似地,也可以给广度优先生成树结点定义时间戳。类似地,也可以给广度优先生成树结点定义时间戳。(二二)最短路径最短路径 显然,从显然,从v0出发广度优先遍历图,将得到出发广度优先遍历图,将得到v0到它的各个可到它的各个可达点的路径。我们这里定义路径上的边的数目为路径长度。达点的路径。我们这里定义路径上的边的数目为路径长度。与深度优先遍历不同,广度优先遍历得到的与深度优先遍历不同,广度优先遍历得到的v0到各点的路到各点的路径是最短路径(未考虑边权)。径是最短路径(未考虑边权)。本章小结本章小结思考与练习1254361、给出下列有向图和无向图的深度优先和广度优先、给出下列有向图和无向图的深度优先和广度优先遍历结果。遍历结果。2、叙述增加新顶点和删除某顶点的过程。叙述增加新顶点和删除某顶点的过程。

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:图的遍历深度优先遍历和广度优先遍历课件.ppt
    链接地址:https://www.163wenku.com/p-5669830.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库