图是严蔚敏书上P168的图,

图的邻接表存储,DFS可以看以前写的文章:http://www.cnblogs.com/youxin/archive/2012/07/28/2613362.html

bool visited[];
void (*visitFunc)(VextexType v); void visit(VextexType v)
{
cout<<v<<ends;
} void BFSTraverse(Graph G,void (*Visit)(VextexType v))
{
visitFunc=Visit;
for(int i=;i<G.vexnum;i++) visited[i]=false;
queue<int> q; for(int i=;i<G.vexnum;i++) //对于连通图为1即可。
{
if(!visited[i])
{
visited[i]=true;//i尚未访问
visitFunc(G.vertices[i].data); q.push(i); while(!q.empty())
{
int front=q.front(); q.pop(); ArcNode *p=G.vertices[front].firstarc;
while(p!=NULL)
{
int w=p->adjvex;
if(!visited[w])
{
visited[w]=true
;visitFunc(G.vertices[w].data); q.push(w);
}

p=p->nextarc;
}
}
}//end if
}//end for
}

首先v1 访问v1 ,v1下一个邻接点为v3,访问v3,v3入队列,访问v2,v2入队列。最终队列变成
v3 v2
会pop v3,访问v3,把v3的所有没有访问的邻接点入队列,即:v7 v6,由于顶点v1访问了,不入queue。
queue变成:
v2 v7 v6
接着pop v2,把v2所有邻接点入queue,v5,v4,,。队列 变成
v7 v6 v5 v4
接着pop v7,把v7邻接点入queue,即:v6和v3已经访问了,不入),队列变成
v6 v5 v4 
接着popv6,把v6邻接点入queue,由于v3已经访问了,队列变成了.
v5 v4 
接着popv5,把v5邻接点v8入queue,变成
v4,,v8
接着popv4,把入queue,队列变成
v8

注意:每个顶点至多入一次队列(我们在进入对了之前会进行判断是否访问,如没有访问,访问它,进入队列,也就是说

在进入队列之前visit已经为true了)。遍历图的过程实质是通过边或弧找邻接点的过程,因此,DFS和BFS遍历图的时间复杂度相同

我们为了求最短路径,还要设置2个数组,

一个是

int d[50];d[v]记录从s到v的路径长度。d[0]为0,源顶点到自身为0.

int parent[50] ;parent[i]表示顶点i的parent。

按照算法导论上面说的:

对上面的代码稍作修改:

void BFSTraverse(Graph G,void (*Visit)(VextexType v))
{
visitFunc=Visit;
for(int i=;i<G.vexnum;i++) visited[i]=false;
queue<int> q;
//我们这里第0个顶点为原点s
for(int i=;i<G.vexnum;i++)
{
d[i]=INT_MAX;//这里不设置也没问题,只要设置d[0]为0就ok了。
parent[i]=-;
}
d[0]=0;
parent[0]=-1;//第0个顶点没有parent。
for(int i=;i<G.vexnum;i++) //对于连通图为1即可。
{
if(!visited[i])
{ visited[i]=true;
visitFunc(G.vertices[i].data); q.push(i); while(!q.empty())
{
int front=q.front(); q.pop(); ArcNode *p=G.vertices[front].firstarc;
while(p!=NULL)
{
int w=p->adjvex;
if(!visited[w])
{
d[w]=d[front]+1,parent[w]=front; visited[w]=true;visitFunc(G.vertices[w].data); q.push(w);
}
p=p->nextarc;
}
}
}//end if
}//end for
}
//输出从s到v的最短路径上的所有顶点
void printPath(Graph G,int s,int v)
{
if(s==v)
cout<<s<<ends; else if(parent[v]==-)
cout<<"no path from s to v exists"<<endl;
else
{
printPath(G,s,parent[v]);
cout<<v<<ends;
} }

基本上就只多了画红线的部分,printPath打印从原顶点到v的所有路径,如:

printPath(G,0,7);

输出:0  1 4 7.

图的BFS代码的更多相关文章

  1. 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...

  2. C#实现在CAD图纸中插入另一个DWG图块的代码

    C#实现在CAD图纸中插入另一个DWG图块的代码 PromptPointResult ppr = ed.GetPoint("请选择插入点:"); Point3d pt = ppr. ...

  3. ACM:图的BFS,走迷宫

    题目: 一个网格迷宫由n行m列的单元格组成,每一个单元格要么是空地(用1表示),要么是障碍物(用0来表示).你的任务是找一条从起点到终点的最短移动序列,当中UDLR分别表示往上.下.左.右移动到相邻单 ...

  4. 图之BFS和DFS遍历的实现并解决一次旅游中发现的问题

    这篇文章用来复习使用BFS(Breadth First Search)和DFS(Depth First Search) 并解决一个在旅游时遇到的问题. 关于图的邻接表存储与邻接矩阵的存储,各有优缺点. ...

  5. UVA-10047 The Monocycle (图的BFS遍历)

    题目大意:一张图,问从起点到终点的最短时间是多少.方向转动也消耗时间. 题目分析:图的广度优先遍历... 代码如下: # include<iostream> # include<cs ...

  6. 算法学习记录-图(DFS BFS)

    图: 目录: 1.概念 2.邻接矩阵(结构,深度/广度优先遍历) 3.邻接表(结构,深度/广度优先遍历) 图的基本概念: 数据元素:顶点 1.有穷非空(必须有顶点) 2.顶点之间为边(可空) 无向图: ...

  7. 图的BFS

    目录: 一.算法的基本思路 二.算法过程 三.题目:785判断是否为二分图 https://blog.csdn.net/weixin_40953222/article/details/80544928 ...

  8. 图的bfs遍历模板(邻接矩阵存储和邻接表存储)

    bfs遍历图模板伪代码: bfs(u){ //遍历u所在的连通块 queue q; //将u入队 inq[u] = true; while (q非空){ //取出q的队首元素u进行访问 for (从u ...

  9. 1128. Partition into Groups(图着色bfs)

    1128 写的dfs貌似不太对 bfs重写 用bfs将图进行黑白染色 如果有超过一个与自己颜色相同的点 就把该点存入栈中 最后处理栈中的点 判断此点是否合法 不合法 取反 取反后再判断相邻点是否合法 ...

随机推荐

  1. Tomcat 的context.xml

    1. 在tomcat 5.5之前: --------------------------------------------------------------- Context体如今/conf/se ...

  2. telnet登陆路由器。。。

    登陆路由有两种方式.一种是console,还有一种是使用telnet,由于我电脑是win7,不支持console.也懒得装软件,就使用telnent为例. 一.开启telnetclient 对于XP. ...

  3. 基于ZooKeeper的Dubbo简单抽样登记中心

    一:设备zookeeper 系统环境 Ubuntu 14.04.2 LTS x64 IP : 192.168.1.102 下载zookeeper-3.4.6.tar.gz到文件夹/opt.拉开拉链 m ...

  4. 保存android程序崩溃日志到SD卡

    private boolean writeToSDCard(Throwable ex) { boolean isDealing = false; if (Environment.getExternal ...

  5. SQL Server索引进阶:第六级,标签

    原文地址: Stairway to SQL Server Indexes: Level 6,Bookmarks 本文是SQL Server索引进阶系列(Stairway to SQL Server I ...

  6. C++运算符重载为成员函数

    #include<iostream> using namespace std; class Complex{ public: Complex(double r=0.0,double i=0 ...

  7. 五毛的cocos2d-x学习笔记07-计时器、数据读写、文件读写

    调度器: 定时任务是通过调度器实现的.cocos2d-x推荐用调度器而不是其他方法实现定时任务.Node类都知道如何调度和取消调度事件. 有3种调度器: 默认调度器:schedulerUpdate() ...

  8. C++ 字符串指针与字符串数组

    在做面试100题中第21题时,发现char *astr="abcdefghijk\0";和char astr[]={"abcdefghijk"};有点区别,以前 ...

  9. Jps介绍以及解决jps无法查看某个已经启动的java进程问题【盗用】

    1.jps的作用 jps类似linux的ps命令,不同的是ps是用来显示进程,而jps只显示java进程,准确的说是当前用户已启动的部分java进程信息,信息包括进程号和简短的进程command. 2 ...

  10. 文件上传 PHP

    参考http://www.w3school.com.cn/php/php_file_upload.asp 文件上传实际上是一个文件复制的过程  当我们选中一个文件之后  php默认的tmp文件夹中就有 ...