例: 求出距离顶点v0的最短路径长度为最长的一个顶点,并要求尽可能节省时间

分析:
用bfs算法(利用bfs算法的层次特性):
从v0出发进行广度遍历时, 最后一层的顶点距离v0的最短路径长度最长。因而可能有多个解,按照本题要求,只要能求出其中一个便可。

int  maxdist (Graph G, int v0) {int w;  Queue  Q;                    // 定义算法中用到的局部变量和队列for (i=1; i<=n; i++)     visited[i]=FALSE;//初始化标志位visited[v0]=TRUE;           //访问顶点v0,其中仅需设置访问标志Q.Append(v0);                        // 被访问顶点入队while (!Empty(Q)){v=Q.Serve();                    // 从队列Q中取顶点,以检测和访问其邻接顶点w=firstadj(G,v);              // 求顶点v的第一个邻接点while (w!=0) {                  // 依次访问v的未被访问过的邻接点if (!visited[w])           { visited[w]=TRUE; Q.Append(w); }        // 访问邻接点ww=nextadj(G,v,w);}     }return  v;                              //将最后一个出队列的v作为结果返回
}

图结构的bfs生成树及其双亲表示形式

简便起见,选择双亲表示法,即对每个顶点,仅给出其父结点信息。
这种表示方法的优点是简便、节省空间
不足是:不直观,在输出各路径时需要反向求解

void bfsSpanTree (Graph G, int v0){int w;  queue  Q;    for (i=1; i<=n; i++)   visited[i]=FALSE; visited[v0]=TRUE; Q.Append(v0); //访问顶点v0,其中仅设置访问标志 parentof[v0]=0;                        //记录顶点v0的双亲结点为0while (!Empty(Q)){v=Q.Serve();        // 从队列Q中取出顶点到v, 以访问其邻接顶点w=firstadj(G,v);   //  求顶点v的第一个邻接点while (w!=0){      //依次访问v的未被访问过的邻接点if (!visited[w]) {     visited[w]=TRUE;  Q.append(w); // 访问邻接点wparentof[w]= v;                              // 记录顶点w的双亲结点为v }w=nextadj(G,v,w);}}for (i=1; i<=n; i++)printpath(parentof, i);               // 输出v0到顶点i的最短路径 }

其中printpath算法描述如下:

void  printpath(int parentof[], int i){      // 输出v0到顶点i的最短路径 if  (i!=0){if (i== v0)  cout<< v0;else { printpath(parentof, parentof[i]);cout<<””<<i;             // 输出路径上的顶点}}
}

【算法】广度遍历算法的应用 求出距离顶点v0的最短路径长度为最长的一个顶点,图结构的bfs生成树及其双亲表示形式相关推荐

  1. 图的深度遍历和广度遍历算法

    图的深度遍历和广度遍历算法 图的深度遍历可以简单理解为一条道走到黑,首先访问图中任一起始顶点v,再访问与v顶点邻接且未被访问过的顶点w1,再访问与w1邻接且未被访问过的顶点w2,重复上述操作,若不能继 ...

  2. 平面内有N个点,如何快速求出距离最近的点对?

    大家好,我们今天来看一道非常非常经典的算法题--最近点对问题. 这个问题经常在各种面试当中出现,难度不低,很少有人能答上来.说实话,我也被问过,因为毫无准备,所以也没有答上来.是的,这道题有点神奇,没 ...

  3. 数据结构——二叉树的递归遍历算法与非递归遍历算法+层次遍历算法

    (文章篇幅有点长,二叉树的递归遍历算法不作详细分析,但是二叉树的非递归遍历算法和层次遍历算法都有非常详细的分析过程,记得往下翻哦!) 二叉树的递归遍历算法实现 我们首先用递归的方法先序遍历创建这样一棵 ...

  4. 给出一个单链表,不知道节点N的值,只遍历一次就可以求出中间节点,写出算法...

    解析:在处理链表问题时,"快行指针"(runner,或称第二个指针)是一种很常见的技巧.快行指针指的是同时用两个指针来迭代访问链表,只不过其中一个比另一个超前一些. 设立两个指针, ...

  5. 循环队列的进队算法c语言,循环队列的定义,入队算法,出队算法,遍历算法,及其代码实现-Go语言中文社区...

    队列 的定义: 一种可以是实现"先进先出"的存储结构.数据的进出类似于排队购票.队只允许队尾一端(rear)添加,在另一端队头(front)删除.队有队头(front)和队尾(re ...

  6. 寻路算法 --- 广度寻路算法

    深度寻路:一个个去试,空旷地形 广度寻路:和深度寻路算法思想截然不同,不是一个个去试,而是依次展开:同样是从起点开始,看周围有哪些可以走的,依次去建立一棵树[ 只有四个方向:四叉树 ],总有一个地方, ...

  7. C++实现遍历链表一次求出中间的节点

    //构建链表 #include"list.h"  listnode* MiddleNOdeFromEnd(listnode* head) { listnode* pahead=he ...

  8. cad高程测绘图lisp_已知CAD中的高程测绘图,很多点,如何求出所有高程的平均值呢?难道只能用计算器一个一个的相加来算吗?...

    回答: 1,地貌显示就简略,又叫计曲线,表示其细部,如丘陵地区的地图上使用较多,是一种比较科学的方法,从底到顶. 等高线表示地貌的原理 等高线表示地貌的原理是,因为等高线是按一定的等高距测绘的,地貌显 ...

  9. 求出所有的水仙花数。所谓水仙花数是指一个三位数,其各位数字的立方和等于该数字本身。比如153是一个水仙花数,因为153=1^3+5^3+3^3。

    #include <stdio.h> int main(void) {int a,b,c;for (a=1;a<10;a++)for (b=0;b<10;b++)for (c= ...

最新文章

  1. vCenter连接esxi 5.0报“Datacenter.QueryConnectionInfo” 失败
  2. 海思 HI35* rtsp服务器
  3. 简评file_get_contents与curl 效率及稳定性
  4. 不常见但很有用的chrome调试工具使用方法
  5. 国内SAP UI5使用者关于性能优化和UI5 Web Component的讨论
  6. input的onchange事件 及只能输入数字实现
  7. 9、kubernetes之statefulset控制器
  8. Atitit.执行cmd 命令行 php
  9. f1c200s核心板_F1C200s NS 2009 驱动
  10. w10投影全屏设置_win10投影仪怎么铺满全屏|win10投影器全屏的设置方法
  11. centos7安装有道词典
  12. html没有注册类,电脑提示没有注册类别的解决方法大全
  13. Android Fragment 真正的完全解析
  14. WinCE桌面添加应用程序的快捷方式
  15. 服务器间通过ssh使用密钥对实现无密码登录
  16. 读取D3D后备缓冲区的数据
  17. 说说Python中切片是什么?
  18. vue-element-admin改造顶部一级导航,侧边二级导航+权限路由
  19. c++11:std::chrono::time_point、time_t、std::localtime、std::gmtime、std::chrono::steady_clock
  20. 联通/电信固话如何设置呼叫转移及如何取消呼叫转移

热门文章

  1. php删除数据库中数据表的数据,php中删除数据库数据例子
  2. flink 7-提交任务
  3. Java中给循环体起别名
  4. java 内存溢出 内存泄露_java 内存泄露、内存溢出、内存不足
  5. mysql校对集_mysql之字符集与校对集
  6. mysql数据库英文句子翻译_MySQL文档翻译(八)附英文原文---性能优化概览
  7. 入住两年的CSDN,在今天2020年8月27日,成为CSDN博客专家
  8. 四十四、Hexo搭建自己的博客
  9. 五十六、 白话讲解商业智能 BI、数据仓库 DW、数据挖掘 DM
  10. 任务型对话系统预训练最新研究进展