图的广度优先查找(BFS: Breadth -First Search) (1)问题分析 BFS的策略是尽可能广泛地搜索图。它首先访问所有和初始顶点邻接的顶点,然后访问距离它两条边的所有未
来源:互联网 发布:航天信息开票软件 编辑:程序博客网 时间:2024/05/16 18:19
图的广度优先查找(BFS: Breadth -FirstSearch)
(1)问题分析
BFS的策略是尽可能广泛地搜索图。它首先访问所有和初始顶点邻接的顶点,然后访问距离它两条边的所有未访问的顶点。以此类推,直到所有与初始顶点同在一个连通分量中的顶点都访问过了为止。若仍存在未被访问的顶点,该算法从图的其他连通分量中的任意顶点重新开始。
(2)解题思路
BFS队列
将遍历的初始顶点作为队列队头顶点,并标记为已访问。在每次迭代时, 该算法找出所有和队头顶点邻接的未访问顶点,将其标记为已访问,并把它们入队,然后从队列中移去队头顶点。
BFS森林
完全类似DFS森林的定义,只不过在DFS森林中,指向已访问顶点的边称为回边,而在BFS森林中,这种边称为交叉边。
代码实现:
#include <iostream>#include <cstring>#define MAX(a,b) (a)>(b)?(a):(b)#define MIN(a,b) (a)<(b)?(a):(b)using namespace std;int map[30][30];int tof[30];char arr[100];int maxn = -1, minn = 30;// 搜索arr数组从beg到end范围内的顶点void BFS(int beg, int end){ int i, j, k = end + 1; int t; int count = 0; // 将搜索到的点放入arr数组中 arr[end] = '\n'; for (i = beg; i < end; ++i) { if (arr[i] == '|') continue; t = arr[i] - 'a'; for (j = minn; j <= maxn; ++j) { if (map[t][j] && tof[j]) { arr[k++] = j + 'a'; tof[j] = 0; count++; } } k++; } k--; arr[k] = '\n'; // 如果没有点可以继续搜索,则退回上一顶点 if (!count) { arr[k] = '\0'; return ; } BFS(end + 1, k);}int main(){ int n, m; char a, b; int c, d; int i, j; // 输入 memset(map, 0, sizeof(map)); memset(tof, 0, sizeof(tof)); printf("请输入顶点个数n以及边数m,格式为<n m>:"); cin >> n >> m; printf("请分别输入%d条边所对应的两个顶点,格式为<a b>:\n",m); for (i = 0; i < m; ++i) { cin >> a >> b; c = a - 'a'; d = b - 'a'; tof[c] = tof[d] = 1; // 构建邻接矩阵,求出最小点和最大点 map[c][d] = map[d][c] = 1; maxn = MAX(maxn, c); maxn = MAX(maxn, d); minn = MIN(minn, c); minn = MIN(minn, d); } // 进行广度优先搜索 for (i = minn; i <= maxn; ++i) { if (tof[i]) { // 初始化arr数组 memset(arr, '|', sizeof(arr)); arr[0] = i + 'a'; arr[1] = '\n'; tof[i] = 0; BFS(0, 1); // 输出 printf("广度优先生成树(与每个顶点连接的点在下一行用‘|’隔开)\n"); for (j = 0; arr[j] != '\0'; ++j) { if (arr[j] == '\n') printf("\n"); else printf("%c ", arr[j]); } printf("\n"); } } printf("遍历结束!\n");}
画如下所示的图:
运行结果:
生成树为:
0 0
- 图的广度优先查找(BFS: Breadth -First Search) (1)问题分析 BFS的策略是尽可能广泛地搜索图。它首先访问所有和初始顶点邻接的顶点,然后访问距离它两条边的所有未
- 图的广度优先搜索(Breadth First Search)
- 图的遍历之广度优先搜索(Breadth First Search)
- 邻接图的广度优先搜索(BFS)
- 广度优先搜索算法(Breadth-First-Search,BFS)
- 广度优先搜索(Breadth First Search,BFS)
- [数据结构]广度优先搜索算法(Breadth-First-Search,BFS)
- LeetCode上Tag为广度优先搜索BFS(Breadth-first Search)的题目整理
- 图搜索算法之广度优先搜索(Breadth First Search,BFS)
- 图的深度优先查找(DFS: Depth -First Search) (1)问题分析 DFS可从任意一个顶点开始访问,其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个顶点只能访问
- BFS-宽度优先搜索(Breadth First Search)—1
- 图的广度优先搜索(BFS)
- 深度优先搜索/广度优先搜索顶点之间的路径(邻接表)
- 算法:图的广度优先遍历(Breadth First Search)
- BFS--广度优先搜索--图的邻接表
- BFS——广度优先算法(Breadth First Search)
- 广度优先搜索算法(breadth First Search, BFS)
- 广度优先搜索算法(BFS,Broad First Search)的PHP实现
- Linux shell重定向
- 第十一周项目6--回文数
- 忽略警告
- Thread+Handler的简单例子
- Android的自定义按钮
- 图的广度优先查找(BFS: Breadth -First Search) (1)问题分析 BFS的策略是尽可能广泛地搜索图。它首先访问所有和初始顶点邻接的顶点,然后访问距离它两条边的所有未
- Load Balancing Scheduling Methods Explained
- Tree
- word的编写模式和ie主页被篡改问题
- linux下更新Python版本并修改默认版本
- 最长公共子序列 【微软面试100题 第五十六题】
- Cocos2dx 3.0 过渡篇(十七) std::bind与CC_CALLBACK不得不说的故事
- 【LeetCode】Min Stack
- Android中Activity启动模式