广度优先搜索类似于树的按层次遍历的过程
遍历过程分析
- 从图中某个顶点v出发,访问v。
- 依次访问v的各个未曾访问过的邻接点。
- 分别从这些邻接点出发依次访问它们的邻接点,并使“先访问的顶点的邻接点”先于“后被访问的顶点的邻接点”被访问。重复步骤(3),直至图中所有已经被访问的顶点的邻接点都被访问到。
如图:
- 从A开始则为A-BC-DEFG-H
- 从B开始则为B-ADE-CFH-G
- 从G开始则为G-CF-A-B-DE-H(具体实现过程每层显示先后是按照输入先后,以具体输出为准,这是大致过程)
算法步骤
- 从图中某个顶点v出发,访问v,并置visited[v]的值为0,然后将v进队。
- 只要队列不为空,则重复下述操作
-
队头顶点u出队
-
依次检查u的所有邻接点w,如果visited[w]的值为0,则访问w,并置visited[w]的值为1,然后将w进队。
主要代码部分
int visited[100] = { 0 };
void BFS(AMgroup &A, int v)
{
cout << A.VTchart[v];
visited[v] = 1; //将遍历点visited设为1
List *Q = Init();
Q = Enter(Q, v); //入队
while (Q->front != Q->rear)
{
int a = Delete(*Q); //出队
for (int i = 0; i < A.point; i++)
{
if (A.AMchart[a][i] != MaxInt&&visited[i] == 0) //a,i两点连通,且i点并未遍历
{
cout << A.VTchart[i];
visited[i] = 1; //将i的visited设为1
Q = Enter(Q, i); //将i入队
}
}
}
}
全部代码
#include<iostream>
using namespace std;
#define MaxSize 20
#define pointMax 100
#define MaxInt 32767
struct AMgroup
{
char VTchart[pointMax]; //顶点表
int AMchart[pointMax][pointMax]; //邻接矩阵
int point, vert; //点,边
};
int AMlocate(AMgroup A, char x)
{
for (int i = 0; i < A.point; i++) //依次输入点的信息
{
if (A.VTchart[i] == x)
{
return i;
break;
}
}
}
void CreatAM(AMgroup &A)
{
cout << "输入邻接矩阵顶点数:"; //第一步
cin >> A.point;
cout << "输入邻接矩阵边数:";
cin >> A.vert;
getchar();
char a[100];
cout << "输入点的信息:"; //第二步
gets_s(a);
for (int i = 0; i < A.point; i++) //依次输入点的信息
{
A.VTchart[i] = a[i];
}
for (int i = 0; i < A.point; i++) //初始换邻接矩阵,边的权值均设为最大 //第三步
{
for (int j = 0; j < A.point; j++)
{
A.AMchart[i][j] = MaxInt;
}
}
cout << endl;
char v1, v2; int len;
for (int i = 1; i <= A.vert; i++) //构造邻接矩阵
{
cout << "输入第" << i << "条边的两个顶点以及权值:"; //第四步
cin >> v1 >> v2 >> len;
int m, n;
m = AMlocate(A, v1);
n = AMlocate(A, v2);
A.AMchart[m][n] = A.AMchart[n][m] = len;
}
}
//队列部分
struct Node
{
int data; //数据域
Node *next; //下一个
};
struct List
{
Node *front; //尾
Node *rear; //头
};
List *Init()
{
List *S = new List;
S->front = S->rear = new Node;
S->front->next = NULL;
return S;
}
List *Enter(List *S ,int a)
{
Node *P = new Node;
P->data = a;
P->next = NULL;
S->rear->next = P;
S->rear = P;
return S;
}
int Delete(List &S)
{
int a;
if (S.front != S.rear)
{
a = S.front->next->data;
S.front = S.front->next;
return a;
}
}
int visited[100] = { 0 };
void BFS(AMgroup &A, int v)
{
cout << A.VTchart[v];
visited[v] = 1; //将遍历点visited设为1
List *Q = Init();
Q = Enter(Q, v); //入队
while (Q->front != Q->rear)
{
int a = Delete(*Q); //出队
for (int i = 0; i < A.point; i++)
{
if (A.AMchart[a][i] != MaxInt&&visited[i] == 0) //a,i两点连通,且i点并未遍历
{
cout << A.VTchart[i];
visited[i] = 1; //将i的visited设为1
Q = Enter(Q, i); //将i入队
}
}
}
}
int main()
{
AMgroup *A = new AMgroup;
CreatAM(*A);
int a;
cout << "\n从第几个点开始遍历:";
cin >> a;
BFS(*A, a);
system("pause");
}
版权声明:本文为qq_46423166原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。