图的BFS代码
图是严蔚敏书上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代码的更多相关文章
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...
- C#实现在CAD图纸中插入另一个DWG图块的代码
C#实现在CAD图纸中插入另一个DWG图块的代码 PromptPointResult ppr = ed.GetPoint("请选择插入点:"); Point3d pt = ppr. ...
- ACM:图的BFS,走迷宫
题目: 一个网格迷宫由n行m列的单元格组成,每一个单元格要么是空地(用1表示),要么是障碍物(用0来表示).你的任务是找一条从起点到终点的最短移动序列,当中UDLR分别表示往上.下.左.右移动到相邻单 ...
- 图之BFS和DFS遍历的实现并解决一次旅游中发现的问题
这篇文章用来复习使用BFS(Breadth First Search)和DFS(Depth First Search) 并解决一个在旅游时遇到的问题. 关于图的邻接表存储与邻接矩阵的存储,各有优缺点. ...
- UVA-10047 The Monocycle (图的BFS遍历)
题目大意:一张图,问从起点到终点的最短时间是多少.方向转动也消耗时间. 题目分析:图的广度优先遍历... 代码如下: # include<iostream> # include<cs ...
- 算法学习记录-图(DFS BFS)
图: 目录: 1.概念 2.邻接矩阵(结构,深度/广度优先遍历) 3.邻接表(结构,深度/广度优先遍历) 图的基本概念: 数据元素:顶点 1.有穷非空(必须有顶点) 2.顶点之间为边(可空) 无向图: ...
- 图的BFS
目录: 一.算法的基本思路 二.算法过程 三.题目:785判断是否为二分图 https://blog.csdn.net/weixin_40953222/article/details/80544928 ...
- 图的bfs遍历模板(邻接矩阵存储和邻接表存储)
bfs遍历图模板伪代码: bfs(u){ //遍历u所在的连通块 queue q; //将u入队 inq[u] = true; while (q非空){ //取出q的队首元素u进行访问 for (从u ...
- 1128. Partition into Groups(图着色bfs)
1128 写的dfs貌似不太对 bfs重写 用bfs将图进行黑白染色 如果有超过一个与自己颜色相同的点 就把该点存入栈中 最后处理栈中的点 判断此点是否合法 不合法 取反 取反后再判断相邻点是否合法 ...
随机推荐
- tomcat的JK和JK2
如今又開始配置JK2,想将Tomcat和apache,但Tomcat上已经不支持对于JK2的开发了,详情请看: Apache-Tomcat mod_jk2 aka JK2 15 November - ...
- java基于P2P的聊天和文件传输实例
用java的NIO技术编写的 1. 支持聊天功能 2. 拖拽文件能够实现文件传输功能.也能够是目录 3. 启动时能够选择server端或client端启动 4. 本人原创.学习NIO和java的网络通 ...
- c/c++中宏定义##连接符 和#符的使用
C语言中如何使用宏C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念).下面对常遇到的宏的使用问题做了简单总结.关于#和##在C语言的宏中,#的功能是将其后面的宏 ...
- Easyui登陆页面制作
一.登陆页面HTML <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Web ...
- python学习(序章)
好久没写过笔记了,最近听说写博客笔记能使知识记忆更深刻,于是就开始写写,不为推广,只为增加记忆.好了,开始python的学习: 学习一门语言的快慢,与人无关,主要是与学习的目的有关,python语言目 ...
- ASP.NET之电子商务系统开发-3(订单)
一.前言 继上次的购物车,这是第三篇.记录一下订单功能.这功能做的时候,走过弯路,很是烧脑,因为思路没理顺,数据库设计的也不怎么好,做到一半才发现有问题,接着把数据库重新设计好,理清思路后,终于完成了 ...
- struts2页面输出错误信息
<package name="user" namespace="/user" extends="struts-default"> ...
- MATLAB - 为什么imshow(g,[])可以正常显示,而imshow(g)却显示空白图像?
Q:为什么imshow(g,[])可以正常显示,而imshow(g)却显示空白图像? A:数据类型如果是double,imshow的处理范围是0-1数据类型如果是uint8,imshow的处理范围是0 ...
- 替换Avada主题的Google字体
刚玩WP的时候图省事,在themeforest买了排行第一的主题Avada,虽然强大,但对我目前的Blog应用而言实在太'重'了.而且老外的主题很多方面不接地气,比如谷歌字体.本文指导各位如何在Ava ...
- BZOJ 4305: 数列的GCD( 数论 )
对于d, 记{ai}中是d的倍数的数的个数为c, 那么有: 直接计算即可,复杂度O(NlogN+MlogM) --------------------------------------------- ...