图是严蔚敏书上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. MZL's xor

    MZL's xor Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) Total Sub ...

  2. Android企业级程序完全退出的解决方案【转】

    http://blog.csdn.net/wangjinyu501/article/details/8763552 问题描述 在平常开发的过程中可以发现,很多开发者对于程序的退出都没有去认真的解决.一 ...

  3. PDFium-PDF开源之旅(1)-初探代码下载编译

    近日,Google和Foxit合作开源了Foxit的PDF源代码. 叫PDFium 相关新闻不少.哈,虽说已经不是程序猿了.只是还是有兴趣跑起来围观看看.废话少说.先说编译代码的步骤(事实上Googl ...

  4. hdu 2777(线段树)

    这道题是看了别人的思路才做出来的. 刚看完这道题没什么思路,线段的长度是10^5,操作指令数是10^5,还要记录不同颜色种类数,觉着怎么写肯定都是要超时.我当时在节点里增加了一个数组记录已经出现的颜色 ...

  5. ubuntu 中 ThinkPHP 上传文件无法得到文件名

    在 419-424 行.

  6. 将Oracle数据库导出为txt格式

    将Oracle数据库导出为txt格式: 方法1: 对于Windows系统,可以采用以下方式: 选择控制面板-->管理工具-->数据源(ODBC),添加一个新的数据源(系统或用户DSN均可) ...

  7. C#中linq报“Character literal must contain exactly one character”的错误提示

    后台代码使用linq提示"Character literal must contain exactly one character": 网上看了一下提示在部分linq语句中直接写入 ...

  8. BZOJ 2752: [HAOI2012]高速公路(road)( 线段树 )

    对于询问[L, R], 我们直接考虑每个p(L≤p≤R)的贡献,可以得到 然后化简一下得到 这样就可以很方便地用线段树, 维护一个p, p*vp, p*(p+1)*vp就可以了 ----------- ...

  9. MapList 自己封装的

    //// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)/ ...

  10. Spring Boot Admin Reference Guide

    1. What is Spring Boot Admin? Spring Boot Admin is a simple application to manage and monitor your S ...