图的广度优先遍历(bfs)
广度优先遍历:
1.将起点s 放入队列Q(访问)
2.只要Q不为空,就循环执行下列处理
(1)从Q取出顶点u 进行访问(访问结束)
(2)将与u 相邻的未访问顶点v 放入Q, 同时将d[v]更新为d[u] + 1
主要变量
| M[n][n] | 邻接矩阵,如果存在顶点i到顶点j 的边,则M[i][j] 为true |
| Queue Q | 记录下一个待访问顶点的队列 |
| d[n] |
将起点s 到个顶点i的最短距离记录在d[i]中。 s无法到达i 时d[i] 为INFTY(极大值) |
#include<iostream>
#include<queue>
using namespace std; static const int N = ;
static const int INFTY = ( << ); int n, M[N][N];
int d[N];//用来存储v到起始顶点的距离 void bfs(int s) {
queue <int> q;
q.push(s);//起始顶点 入队
//设置初始值, 通过判断距离大小来明白该顶点是否被访问
for(int i = ; i < n; i++) d[i] = INFTY;
d[s] = ;//初始值为0
int u;
while( !q.empty() ) {
u = q.front();
q.pop();
//检索与该顶点有连接的顶点,并入队
for(int v = ; v < n; v++) {
if(M[u][v] = ) continue;
//如果该顶点被访问过
if(d[v] != INFTY) continue;
//该顶点与起始顶点的距离等于,上一个顶点与起始顶点距离加1
d[v] = d[u] + ;
q.push(v);
}
}
//输出,若未被访问则输出-1
for(int i = ; i < n; i++) {
cout << i + << " " << ( (d[i] == INFTY) ? (-) : d[i] ) << endl;
}
} int main() {
int u, k, v;
cin >> n;
//初始化
for(int i = ; i < n; i++) {
for(int j = ; j < n; j++)
M[i][j] = ;
}
//输入数据构建邻接矩阵
for(int i = ; i < n; i++) {
cin >> u >> k;
u--;
for(int j = ; j < k; j++) {
cin >> v;
v--;
M[u][v] = ;
}
}
//广度优先遍历
bfs(); return ;
} /*
4
1 2 2 4
2 1 4
3 0
4 1 3
*/
图的广度优先遍历(bfs)的更多相关文章
- 算法学习 - 图的广度优先遍历(BFS) (C++)
广度优先遍历 广度优先遍历是非经常见和普遍的一种图的遍历方法了,除了BFS还有DFS也就是深度优先遍历方法.我在我下一篇博客里面会写. 遍历过程 相信每一个看这篇博客的人,都能看懂邻接链表存储图. 不 ...
- 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)
一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...
- 图的广度优先遍历算法(BFS)
在上一篇文章我们用java演示了图的数据结构以及图涉及到的深度优先遍历算法,本篇文章将继续演示图的广度优先遍历算法.广度优先遍历算法主要是采用了分层的思想进行数据搜索.其中也需要使用另外一种数据结构队 ...
- PTA 邻接表存储图的广度优先遍历(20 分)
6-2 邻接表存储图的广度优先遍历(20 分) 试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(V ...
- 广度优先遍历-BFS、深度优先遍历-DFS
广度优先遍历-BFS 广度优先遍历类似与二叉树的层序遍历算法,它的基本思想是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问的顶点w1 w2 w3....wn,然后再依次访问w1 w2 w3 ...
- PTA 邻接表存储图的广度优先遍历
试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ) 其中LGraph是邻接表存储的 ...
- 图的深度优先遍历(DFS)和广度优先遍历(BFS)
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析
1. 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 1.首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 2.当没有未访问过的顶点时,则回 ...
- 17.广度优先遍历bfs
#include <iostream> #include <boost/config.hpp> //图(矩阵实现) #include <boost/graph/adjac ...
随机推荐
- java快速开发平台可视化开发表单
XJR java快速开发平台,简单的理解就是:开发人员以某种编程语言或者某几种编程语言(比如:目前流行的多种web技术,包括springboot, JPA,Druid, Activiti,Lombok ...
- 50-Python2和3字符编码的区别
目录 Python2和3字符编码的区别 python2 python3 Python2和3字符编码的区别 区别点 python2 python3 print 是一个语法结构 是一个函数,print(' ...
- Android开发 run的时候出现waiting for debugger的情况,及解决问题
出现原因:不清楚,大概推测是因为缓存没有清除干净 解决方法: 方法一. 重新启动模拟器 好像就点右上角的x符号是没有用的,因为会保存状态,在关闭之后还要点击Cold Boot Now,冷启动,才会把之 ...
- 峰哥说技术:02-第一个Spring Boot应用程序
Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 02第一个Spring Boot应用程序 1.版本要求 集成开发环境:IntelliJ IDEA 2017 ...
- hadoop HDFS扩容
1.纵向扩容(添加硬盘) 1.1 添加硬盘 确定完成添加,运行 lsblk 查看硬盘使用情况 1.2 硬盘分区 fdisk /dev/sdb #对新硬盘sdb进行分区 m 帮助 n 添加一个分区 p ...
- 外部配置属性值是如何被绑定到XxxProperties类属性上的?--SpringBoot源码(五)
注:该源码分析对应SpringBoot版本为2.1.0.RELEASE 1 前言 本篇接 SpringBoot是如何实现自动配置的?--SpringBoot源码(四) 温故而知新,我们来简单回顾一下上 ...
- TCP粘包很难么,为何我屡屡受挫??
无论走到哪里,都应该记住,过去都是假的,回忆是一条没有尽头的路,一切以往的春天都不复存在,就连那最坚韧而又狂乱的爱情归根结底也不过是一种转瞬即逝的现实. --马尔克斯 本文已经收录至我的GitHub, ...
- [android]p7-1 fragment学习笔记
本文源自<android权威编程指南第3版>第7章UI fragment与fragment 第7章主要内容是实现一个记录不良行为的APP(部分实现),有列表,有具体的行为内容显示.第7章主 ...
- call、apply和bind的学习
相似之处:1.都是用来改变函数的this对象的指向的.2.第一个参数都是this要指向的对象.3.都可以利用后续参数传参. var xw = { name : "小王",gend ...
- js 随机产生100个0~1000之间的整数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...