图是严蔚敏书上P168的图,

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

  1. bool visited[];
  2. void (*visitFunc)(VextexType v);
  3.  
  4. void visit(VextexType v)
  5. {
  6. cout<<v<<ends;
  7. }
  8.  
  9. void BFSTraverse(Graph G,void (*Visit)(VextexType v))
  10. {
  11. visitFunc=Visit;
  12. for(int i=;i<G.vexnum;i++) visited[i]=false;
  13. queue<int> q;
  14.  
  15. for(int i=;i<G.vexnum;i++) //对于连通图为1即可。
  16. {
  17. if(!visited[i])
  18. {
  19. visited[i]=true;//i尚未访问
  20. visitFunc(G.vertices[i].data);
  21.  
  22. q.push(i);
  23.  
  24. while(!q.empty())
  25. {
  26. int front=q.front(); q.pop();
  27.  
  28. ArcNode *p=G.vertices[front].firstarc;
  29. while(p!=NULL)
  30. {
  31. int w=p->adjvex;
  32. if(!visited[w])
  33. {
  34. visited[w]=true;visitFunc(G.vertices[w].data);
  35. q.push(w);
  36. }
  37. p=p->nextarc;
  38. }
  39. }
  40. }//end if
  41. }//end for
  42. }

首先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。

按照算法导论上面说的:

对上面的代码稍作修改:

  1. void BFSTraverse(Graph G,void (*Visit)(VextexType v))
  2. {
  3. visitFunc=Visit;
  4. for(int i=;i<G.vexnum;i++) visited[i]=false;
  5. queue<int> q;
  6. //我们这里第0个顶点为原点s
  7. for(int i=;i<G.vexnum;i++)
  8. {
  9. d[i]=INT_MAX;//这里不设置也没问题,只要设置d[0]为0就ok了。
  10. parent[i]=-;
  11. }
  12. d[0]=0;
  13. parent[0]=-1;//第0个顶点没有parent。
  14. for(int i=;i<G.vexnum;i++) //对于连通图为1即可。
  15. {
  16. if(!visited[i])
  17. {
  18.  
  19. visited[i]=true;
  20. visitFunc(G.vertices[i].data);
  21.  
  22. q.push(i);
  23.  
  24. while(!q.empty())
  25. {
  26. int front=q.front(); q.pop();
  27.  
  28. ArcNode *p=G.vertices[front].firstarc;
  29. while(p!=NULL)
  30. {
  31. int w=p->adjvex;
  32. if(!visited[w])
  33. {
  34. d[w]=d[front]+1,parent[w]=front;
  35.  
  36. visited[w]=true;visitFunc(G.vertices[w].data);
  37.  
  38. q.push(w);
  39. }
  40. p=p->nextarc;
  41. }
  42. }
  43. }//end if
  44. }//end for
  45. }
  46. //输出从s到v的最短路径上的所有顶点
  47. void printPath(Graph G,int s,int v)
  48. {
  49. if(s==v)
  50. cout<<s<<ends;
  51.  
  52. else if(parent[v]==-)
  53. cout<<"no path from s to v exists"<<endl;
  54. else
  55. {
  56. printPath(G,s,parent[v]);
  57. cout<<v<<ends;
  58. }
  59.  
  60. }

基本上就只多了画红线的部分,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. Tempter of the Bone(dfs奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  2. 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 ...

  3. $timeout, $interval

    $timeout, $interval   layout: posttitle: Angular@1.4.3 中文 API 服务篇 $timeout & $intervaldesc: '$ti ...

  4. 简单的web三层架构系统【第二版】

    昨天写了 web三层架构的第一版,准确的说是三层架构的前期,顶多算是个二层架构,要慢慢完善. 第一版里,程序虽说能运行起来,但是有一个缺陷,就是里面的SQL语句,是使用的拼接字符进行执行.这样安全系数 ...

  5. Extjs 3.4 生成button,并調用相同的window

    /////定義一個方法,用來調用win_mucangjieshou的窗口 var panel_contant= function(id_name){ var aa=Ext.getCmp(id_name ...

  6. 访问权限系列一(public/private/protected/default):成员变量

    通过两个程序包对自身或互相之间的访问,得到结果.(先编译Test_01,得到class文件,通过Test的集中访问情况) 如下Test.java中内容: package com.java; /* * ...

  7. Object-c Block的使用及说明

    Object-c 中的block就好像一段C函数般,由函数名,有返回值,有参数,由函数体等 1.简单的block ^(int A ,int B) { int C=A*B; return C; }; 上 ...

  8. ThreadSafeClientConnManager用来支持多线程的使用http client

    import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.clien ...

  9. JAVA FILE or I/O学习 - Desktop本地程序学习

    public class DesktopKnow { public void know() { try { Desktop.getDesktop().open(new File("C:\\P ...

  10. File,FileInputStream,FileReader,InputStreamReader,BufferedReader 的使用和区别

    1 ) File 类介绍 File 类封装了对用户机器的文件系统进行操作的功能.例如,可以用 File 类获得文件上次修改的时间移动, 或者对文件进行删除.重命名.换句话说,流类关注的是文件内容,而 ...