广度优先搜索 (BFS)
广度优先搜索就像排山倒海,或者说像是往水中投一块石头,水波从中心点向四周蔓延开来。BFS常用于最短路径的查找,既然是一层层进行遍历,那么最先到达目标点所在的路径就是最短路径。
下面来看有向图的广度优先搜索算法的实例,某有向图如下:
#include <stdio.h> // 邻接矩阵 typedef struct { char vexs[20]; // 顶点存储数据 int matrix[20][20]; // 邻接矩阵 int vexNum, arcNum; // 顶点数 弧数 } MatrixGraph; int visited[20]; // 是否被访问过 // 广度优先搜索用到了队列 typedef struct { int data[20]; int front, rear; } Queue; void InitQueue(Queue &q) { q.front = 0; q.rear = 0; } void EnQueue(Queue &q, int e) { if((q.rear+1) % 20 == q.front) { return ; } q.data[q.rear] = e; q.rear = (q.rear+1) % 20; } void DeQueue(Queue &q, int &e) { if(q.front == q.rear) { return ; } e = q.data[q.front]; q.front = (q.front+1) % 20; } int QueueEmpty(Queue &q) { if(q.front == q.rear) { return 1; } return 0; } void BFS_DG(MatrixGraph &graph); /**input: 6 8 abcdef 0 1 0 2 1 2 2 5 5 4 5 3 3 4 1 3 */ int main() { MatrixGraph graph; // 图的顶点数和弧数 scanf("%d%d", &graph.vexNum, &graph.arcNum); getchar(); // 图的顶点所存储数据 for(int i=0; i<graph.vexNum; i++) { scanf("%c", &graph.vexs[i]); } // 邻接矩阵初始化(置无限大) for(int i=0; i<graph.vexNum; i++) { for(int j=0; j<graph.vexNum; j++) { graph.matrix[i][j] = 0x7fffffff; } } for(int i=0; i<graph.arcNum; i++) { int a, b; scanf("%d%d", &a, &b); // 有向图 graph.matrix[a][b] = 1; } BFS_DG(graph); } void BFS_DG(MatrixGraph &graph) { Queue queue; InitQueue(queue); for(int i=0; i<graph.vexNum; i++) { visited[i] = 0; } printf("广度优先查找结果:\n"); for(int i=0; i<graph.vexNum; i++) { if(!visited[i]) { visited[i] = 1; printf("%c ", graph.vexs[i]); EnQueue(queue, i); while(!QueueEmpty(queue)) { DeQueue(queue, i); for(int j=0; j<graph.vexNum; j++) { if(!visited[j] && graph.matrix[i][j]!=0x7fffffff) { visited[j] = 1; printf("%c ", graph.vexs[j]); EnQueue(queue, j); } } } } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律