图的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将图进行黑白染色 如果有超过一个与自己颜色相同的点 就把该点存入栈中 最后处理栈中的点 判断此点是否合法 不合法 取反 取反后再判断相邻点是否合法 ...
随机推荐
- Tempter of the Bone(dfs奇偶剪枝)
Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- SharePoint 2007 (MOSS/WSS) - how to remove "Download a Copy" context menu from a Document Library
One of my friend and colleague asked me this question. I found it tricky and a good post for my blog ...
- $timeout, $interval
$timeout, $interval layout: posttitle: Angular@1.4.3 中文 API 服务篇 $timeout & $intervaldesc: '$ti ...
- 简单的web三层架构系统【第二版】
昨天写了 web三层架构的第一版,准确的说是三层架构的前期,顶多算是个二层架构,要慢慢完善. 第一版里,程序虽说能运行起来,但是有一个缺陷,就是里面的SQL语句,是使用的拼接字符进行执行.这样安全系数 ...
- Extjs 3.4 生成button,并調用相同的window
/////定義一個方法,用來調用win_mucangjieshou的窗口 var panel_contant= function(id_name){ var aa=Ext.getCmp(id_name ...
- 访问权限系列一(public/private/protected/default):成员变量
通过两个程序包对自身或互相之间的访问,得到结果.(先编译Test_01,得到class文件,通过Test的集中访问情况) 如下Test.java中内容: package com.java; /* * ...
- Object-c Block的使用及说明
Object-c 中的block就好像一段C函数般,由函数名,有返回值,有参数,由函数体等 1.简单的block ^(int A ,int B) { int C=A*B; return C; }; 上 ...
- ThreadSafeClientConnManager用来支持多线程的使用http client
import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.clien ...
- JAVA FILE or I/O学习 - Desktop本地程序学习
public class DesktopKnow { public void know() { try { Desktop.getDesktop().open(new File("C:\\P ...
- File,FileInputStream,FileReader,InputStreamReader,BufferedReader 的使用和区别
1 ) File 类介绍 File 类封装了对用户机器的文件系统进行操作的功能.例如,可以用 File 类获得文件上次修改的时间移动, 或者对文件进行删除.重命名.换句话说,流类关注的是文件内容,而 ...