基本思想
在广度优先遍历中,如果将每次“前进”(纵深)路过的(将被访问的)结点和边都记录下来,就得到一个子图,该子图为以出发点为根的树,称为广度优先生成树。这种情况与深度优先遍历类似。
算法:(邻接矩阵实现)
#include <stdio.h> #include <queue> using namespace std; #define N 10 int visit[N]; // 广度优先之节点遍历 // // 0-----4----------8 // | | | // | | | // 1-----3----5-----7 // | | | // | | | // 2----------6-----9 // int matrix[N][N] = { 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 }; void BFS(int x) { for (int i = 0; i < N; i++) visit[i] = 0; // 初始各点均未访问 std::queue<int> q; // BFS类似于二叉树的层次遍历,因此也要用到队列 q.push(x); visit[x] = 1; while (!q.empty()) { int cur = q.front(); printf("%d ", cur); q.pop(); for (int i = 0; i < N; i++) { if (0 == visit[i] && 1 == matrix[cur][i]) { q.push(i); visit[i] = 1; } } } } int main() { BFS(0); getchar(); return 0; }