博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法】广度遍历算法的应用 求出距离顶点v0的最短路径长度为最长的一个顶点,图结构的bfs生成树及其双亲表示形式
阅读量:3904 次
发布时间:2019-05-23

本文共 2025 字,大约阅读时间需要 6 分钟。

例: 求出距离顶点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); } // 访问邻接点w w=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的双亲结点为0 while (!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); // 访问邻接点w parentof[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<<””<

转载地址:http://vtten.baihongyu.com/

你可能感兴趣的文章
c++ 内存管理:9、malloc/free的使用要点 new/delete的使用要点
查看>>
STL中map用法详解
查看>>
面试之网络问题
查看>>
2014校园招聘总结 .
查看>>
Linux C编程--main函数参数解析 .
查看>>
Socket send函数和recv函数详解
查看>>
gcc和g++的区别
查看>>
TCP/IP源码(59)——TCP中的三个接收队列
查看>>
TCP的TIME_WAIT状态
查看>>
linux多线程编程相关知识
查看>>
Linux多线程同步机制 .linux多线程编程机制
查看>>
Linux进程间通信 .
查看>>
电子书下载网站备份 .
查看>>
Linux多线程与同步
查看>>
c++ 多线程编程 笔记
查看>>
查找结构 动态查找树比较 树(BST),平衡二叉查找树(AVL),红黑树(RBT),B~/B+树(B-tree)
查看>>
linux内核中 校验相关的一些结构
查看>>
ubutun12.04下安装ssh
查看>>
linux常用 字符 查找命令 grep find cat locate 文本编辑命令vi
查看>>
TCP:浅析拥塞控制窗口、慢启动、拥塞避免在linux内核中的实现
查看>>