图是严蔚敏书上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. android 围绕中心旋转动画

    本文主要介绍Android中如何使用rotate实现图片不停旋转的效果.Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果 ...

  2. iOS app 集成友盟推送问题

    之前做app推送主要是集成友盟SDK,在程序获取deviceToken时,老是提示如下错误: Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用 ...

  3. zoj 3714 Java Beans

    /*很简单的一题,求连续的m位,求总和最多的值,循环找一下,就出来了*/ #include<stdio.h> ]; int main(int argc, char* argv[]) { i ...

  4. CodeForces 447C DZY Loves Sequences DP

    题目:click here 题意:求给定序列更改其中一个元素后的最长连续上升子序列的长度 分析:最长的连续子序列有2种,一种是严格上升(没有更改元素)的长度加1,一种是两段严格上升的加起来. #inc ...

  5. js限制图片的大小

    <form id="financialForm" action="<%=basePath%>riskcontrol/website/review_bor ...

  6. java 简单的词法分析

    package com.seakt.example; import java.io.*; import java.lang.String; public class J_Scanner { publi ...

  7. web乱码问题

    String data = "不见青山"; ServletOutputStream sos = response.getOutputStream(); byte b[] = dat ...

  8. Storm几篇文章

    http://tianhailong.com/ http://www.cnblogs.com/panfeng412/archive/2012/07/02/storm-common-patterns-o ...

  9. perl5 第十章 格式化输出

    第十章 格式化输出 by flamephoenix 一.定义打印格式二.显示打印格式三.在打印格式中显示值  1.通用的打印格式  2.格式和局域变量  3.选择值域格式  4.输出值域字符四.输出到 ...

  10. JavaEE Tutorials (10) - Java持久化查询语言

    10.1查询语言术语14010.2使用Java持久化查询语言创建查询141 10.2.1查询中的命名参数142 10.2.2查询中的位置参数14210.3简化的查询语言语法142 10.3.1选择语句 ...