路径规划(一):广度优先搜索算法(BFS)

news/2024/6/29 12:02:26 标签: 宽度优先, 算法, c++

广度优先搜索算法(BFS)

  • 一、概述
  • 二、BFS算法步骤
  • 三、相关代码

一、概述

  广度优先搜索算法,简称BFS(Breadth-First Search),是一种图搜索算法。它从起始节点开始,依次遍历与起始节点相邻的节点,然后依次遍历与这些节点相邻但尚未访问的节点,直到遍历完所有与起始节点连接的节点。
  BFS的优点是能够找到最短路径。当需要找到两个节点之间的最短路径时,可以使用BFS来解决。它也适用于无权图的遍历,以及寻找图中的连通分量和环的问题。

二、BFS算法步骤

BFS算法的步骤如下:

  1. 创建一个队列,用于存储待访问的节点。
  2. 将起始节点入队列。
  3. 标记起始节点为已访问。
  4. 当队列不为空时执行以下步骤:
    • 出队列当前节点,并访问该节点。
    • 对当前节点的所有邻接节点进行以下操作:
      • 如果邻接节点未被访问,则将其入队列,并标记为已访问。
  5. 重复步骤4直到队列为空。

三、相关代码

#include <stdio.h>

#define MAX_SIZE 100

int graph[MAX_SIZE][MAX_SIZE]; // 图的邻接矩阵
int visited[MAX_SIZE]; // 访问标记数组
int queue[MAX_SIZE]; // 队列

int front = -1; // 队列头指针
int rear = -1; // 队列尾指针

// 入队列
void enqueue(int vertex) {
    if (rear == MAX_SIZE - 1) {
        printf("Queue is full.\n");
        return;
    }
    if (front == -1) {
        front = 0;
    }
    rear++;
    queue[rear] = vertex;
}

// 出队列
int dequeue() {
    if (front == -1 || front > rear) {
        printf("Queue is empty.\n");
        return -1;
    }
    int vertex = queue[front];
    front++;
    return vertex;
}

// 广度优先搜索算法
void bfs(int start, int numVertices) {
    // 初始化访问标记数组
    for (int i = 0; i < numVertices; i++) {
        visited[i] = 0;
    }

    // 将起始节点入队列并标记为已访问
    enqueue(start);
    visited[start] = 1;

    while (front != -1 && front <= rear) {
        // 出队列并访问节点
        int currentVertex = dequeue();
        printf("%d ", currentVertex);

        // 遍历当前节点的邻接节点
        for (int i = 0; i < numVertices; i++) {
            if (graph[currentVertex][i] == 1 && !visited[i]) {
                enqueue(i);
                visited[i] = 1;
            }
        }
    }
}

int main() {
    int numVertices, start;
    printf("Enter the number of vertices in the graph: ");
    scanf("%d", &numVertices);

    printf("Enter the adjacency matrix of the graph:\n");
    for (int i = 0; i < numVertices; i++) {
        for (int j = 0; j < numVertices; j++) {
            scanf("%d", &graph[i][j]);
        }
    }

    printf("Enter the starting vertex: ");
    scanf("%d", &start);

    printf("BFS traversal: ");
    bfs(start, numVertices);

    return 0;
}

http://www.niftyadmin.cn/n/5313594.html

相关文章

秋招阿里巴巴java笔试试题-精

一、单项选择题 1、以下函数的时间复杂度是 &#xff08; &#xff09; 1 2 3 4 5 6 7 8 9 void func(int x,int y, int z){ if(x<0) printf("%d, %d\n", y, z); else { func(x-1,y1,z); func(x-1,y,z1); } } A.O(x*y*z) B.O(x^2*y^2) C.O(2^x) D.O(2^x*…

静态关键字:static

static的作用 static是静态的意思&#xff0c;可以修饰成员变量和成员方法。 static修饰成员变量表示该成员变量只在内存中只存储一份&#xff0c;可以被共享访问、修改。 成员变量 分为2类 静态成员变量&#xff08;有static修饰&#xff0c;属于类&#xff0c;内存中加载…

【精选】小白 windows操作系统 使用教程(超详细)

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步…

0109作业

1> 思维导图 2> 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin&quo…

系分笔记数据库技术之数据库安全措施

文章目录 1、概要2、数据库的保护措施3、数据库的故障4、备份和日志5、总结 1、概要 数据库设计是考试重点&#xff0c;常考和必考内容&#xff0c;本篇主要记录了知识点&#xff1a;数据库故障及解决、数据库安全保护措施和数据库备份及恢复。 2、数据库的保护措施 数据库安全…

Influxdb2修改管理员密码

通过恢复管理员令牌来重置InfluxDB2管理员的密码 1.找到数据库的配置文件 一般为config.json 2.配置文件的的blod文件配置 3.在这个混合文本和二进制json文件中搜索已知的用户名或token之类的字符串。 例如&#xff1a; "id":"0bd73badf2941000","…

构建高效秒杀系统的设计原理及注意事项

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

1. Mybatis 中 SqlSession接口的三种实现

Mybatis 中 SqlSession接口的三种实现 ​SqlSession​ 是一个接口&#xff0c;并且里面包含了许多 CRUD 操作数据库等方法。 ​SqlSession​​ 它有三个实现类&#xff0c;分别是 SqlSessionManager​​ 、DefaultSqlSession​​ 和 SqlSessionTemplate​​&#xff0c;其中 …