图的广度优先遍历(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 ...
随机推荐
- spring——AOP原理及源码(三)
在上一篇中,我们创建并在BeanFactory中注册了AnnotationAwareAspectJAutoProxyCreator组件.本篇我们将要探究,这个组件是在哪里以及何时发挥作用的. 调试的起 ...
- html建立大众点评页面遇到的问题
大众点评所用知识 HTML.CSS.bootstrap3 遇到的问题 因图片无法对齐 源码:抛弃div改用img后成功对齐 解决后成功对齐 源码: 导航栏文本无法右对齐. 我想到的方法是: div{ ...
- .NET微服务从0到1:服务注册与发现(Consul)
目录 Consul搭建 基于Docker搭建Consul 基于Windows搭建Consul ServiceA集成Consul做服务注册 Ocelot集成Consul做服务发现 更多参考 Consul ...
- 分布式图数据库 Nebula Graph 的 Index 实践
导读 索引是数据库系统中不可或缺的一个功能,数据库索引好比是书的目录,能加快数据库的查询速度,其实质是数据库管理系统中一个排序的数据结构.不同的数据库系统有不同的排序结构,目前常见的索引实现类型如 B ...
- TCP报文首部
源端口和目的端口,各占2个字节,每个TCP报文段都包含源端口号和目的端口号,用于寻找发送端和接收端的应用进程: 序号,占4个字节,序号用来标识从TCP发送端向TCP接收端发送的数据字节流,它表示在这个 ...
- Flutter json 2 model with Built Value
Flutter json 2 model with Built Value Flutter中json转换model, 除了手动转之外, 就是利用第三方库做一些代码生成. 流行的库有: json_ser ...
- rabitmq + php
消费者 <?php //配置信息 $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => ...
- (转)协议森林11 涅槃 (TCP重新发送)
协议森林11 涅槃 (TCP重新发送) 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! TCP协议是一个可靠的协议.它通过重新发送 ...
- Java学习笔记(3)——有关异常
异常处理: try { }catch(ExceptionType0 e) { }catch(ExceptionType1 e) { }.....finally { } 有四种情况不执行finally语 ...
- 解决Tomcat控制台输出乱码问题
解决Tomcat控制台输出乱码问题 打开Edit Configuration,在VM options一栏输入 -Dfile.encoding=UTF-8 然后到IDEA的bin目录找到 idea64. ...