图的广度优先遍历

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++代码:

以上是关于图的广度优先遍历的主要内容,如果未能解决你的问题,请参考以下文章

图的深度/广度优先遍历C语言程序

数据结构C语言版 图的广度优先遍历和深度优先遍历 急急急 会查重

C语言实现图的广度优先搜索遍历算法

什么是图的深度优先遍历?什么是图的广度优先遍历?

图的广度遍历和深度遍历

图的遍历:深度优先遍历,广度优先遍历