图的广度优先搜索
示例图结构
广度优先搜索类比树的层序遍历,利用队列来实现,第一次进入第一个节点,其后每次出队一个节点就进入这个顶点的全部邻接点,然后为了防止出现死循环,利用一个节点访问数组来存储访问信息。
#include<iostream>
#define MAX_NUM 100
#define MAX_INT 32767
using namespace std;
typedef struct {
int arc[MAX_NUM][MAX_NUM];
char vex[MAX_NUM];
int arcnum,vexnum;
} AMGraph;
typedef struct {
int *v;
int front;
int rear;
} queue;
queue Q;
AMGraph G;
bool visit[MAX_NUM]= {false};
void create_G(AMGraph& G);
void BFS(AMGraph G);
int locatevex(AMGraph& G,char v);
void initqueue(queue& Q);
void enterqueue(queue& Q,char v);
bool emptyqueue(const queue& Q);
char dequeue(queue& Q,int& u);
int main()
{
create_G(G);
BFS(G);
return 0;
}
char dequeue(queue& Q,int& u)
{
u=Q.v[Q.front];
Q.front++;
return u;
}
bool emptyqueue(const queue& Q)
{
if(Q.front==Q.rear)
return true;
else
return false;
}
void enterqueue(queue& Q,int v)
{
Q.v[Q.rear]=v;
Q.rear++;
}
void initqueue(queue& Q)
{
Q.v=new int[MAX_INT];
Q.front=Q.rear=0;
}
int locatevex(AMGraph& G,char v)
{
for(int i=0; i<G.vexnum; i++) {
if(G.vex[i]==v)
return i;
}
return -1;
}
void BFS(AMGraph G)
{
int v = 0;
int u = 0;
initqueue(Q);
for (v = 0; v < G.vexnum; v++)
{
if (!visit[v])
{
cout << G.vex[v]<<" ";
visit[v] = true;
enterqueue(Q, v);
while (Q.front != Q.rear)
{
dequeue(Q, u);
for (int w = 0; w < G.vexnum; w++)
{
if ((G.arc[u][w] != MAX_INT) && (visit[w] != true))
{
visit[w] = true;
cout << G.vex[w] << " ";
enterqueue(Q, w);
}
}
}
}
}
cout << endl;
}
void create_G(AMGraph& G)
{
char v1,v2;
int w;
cin>>G.vexnum>>G.arcnum;//总顶点数,总边数
for(int i=0; i<G.vexnum; i++) {
cin>>G.vex[i];
}
for(int i=0; i<G.vexnum; i++) {
for(int j=0; j<G.vexnum; j++) {
G.arc[i][j]=MAX_INT;
}
}
int i,j;
for(int k=0; k<G.vexnum; k++) {
cin>>v1>>v2>>w;
i=locatevex(G,v1);
j=locatevex(G,v2);
G.arc[i][j]=w;
G.arc[j][i]=G.arc[i][j];
}
}
注意队列操作,以及访问多少次节点数组和判断是否满足入队条件
运行结果如下:
a\Roaming\Typora\typora-user-images\image-20201127102302224.png" alt=“image-20201127102302224” style=“zoom:50%;” />
运行结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-poFdoyDB-1607695647270)(C:\Users\GHB\AppData\Roaming\Typora\typora-user-images\image-20201127102402132.png)]