图的广度优先遍历
Posted zuofaqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的广度优先遍历相关的知识,希望对你有一定的参考价值。
广度优先遍历指算法始终是将已发现节点和未发现节点之间的边界沿广度方向向外扩展,也就是,算法在发现和源节点s的距离为k的所有节点后,才会发现和源节点s的距离为k+1的其他节点。
算法实现上,使用队列保存已发现的节点。每次从队列中取一个节点,遍历其所有相邻节点(已经遍历过的不再遍历,通过颜色来标记),再把该节点入队。循环直到队列为空
#include <cstdlib>
#include <cstring>
#include <queue>
#include <list>
#include <cstdio>
typedef unsigned int u_int;
static const u_int s_vertex_num = 8;
enum
{
WHITE = 0,
GRAY,
BLACK
};
struct stVertex
{
u_int m_iWeight:1;
u_int m_iColor:4;
u_int m_iParent:8;
u_int m_iDistance;
stVertex *adj[s_vertex_num];
char m_cId;
stVertex() : m_iWeight(0),m_iColor(WHITE),m_iDistance(-1)
{
memset(adj, 0, s_vertex_num * sizeof(stVertex*));
}
stVertex(char id) : m_cId(id),m_iWeight(0),m_iColor(WHITE),m_iDistance(-1)
{
memset(adj, 0, s_vertex_num * sizeof(stVertex*));
}
};
struct stGraph
{
stVertex m_Matrix[s_vertex_num];
void init();
void bfs(int startIndex);
private:
void initAdj(stVertex *vertex, char id, const char *ids);
};
void stGraph::initAdj(stVertex *vertex, char id, const char *ids)
{
vertex->m_cId = id;
int index = 0;
for (const char *p = ids; *p; ++p)
{
vertex->adj[index++] = &m_Matrix[*p - ‘0‘];
}
}
// 使用临接链表表示
void stGraph::init()
{
initAdj(&m_Matrix[0], ‘r‘, "14");
initAdj(&m_Matrix[1], ‘s‘, "05");
initAdj(&m_Matrix[2], ‘t‘, "563");
initAdj(&m_Matrix[3], ‘u‘, "267");
initAdj(&m_Matrix[4], ‘v‘, "0");
initAdj(&m_Matrix[5], ‘w‘, "126");
initAdj(&m_Matrix[6], ‘x‘, "5237");
initAdj(&m_Matrix[7], ‘y‘, "63");
}
void stGraph::bfs(int startIndex)
{
std::queue<stVertex*, std::list<stVertex*> > q;
m_Matrix[startIndex].m_iColor = GRAY;
m_Matrix[startIndex].m_iDistance = 0;
m_Matrix[startIndex].m_iParent = -1;
q.push(&m_Matrix[startIndex]);
while (!q.empty())
{
stVertex *u = q.front();
q.pop();
int index = 0;
stVertex *v = u->adj[index++];
while (v)
{
if (v->m_iColor == WHITE)
{
v->m_iColor = GRAY;
v->m_iDistance = u->m_iDistance + 1;
v->m_iParent = u->m_cId;
q.push(v);
}
v = u->adj[index++];
}
u->m_iColor = BLACK;
printf("%c, %d, %c
", u->m_cId, u->m_iDistance, u->m_iParent);
}
}
int main()
{
stGraph graph;
graph.init();
graph.bfs(1);
return 0;
}
以这个图为例,c++代码:
以上是关于图的广度优先遍历的主要内容,如果未能解决你的问题,请参考以下文章