码迷,mamicode.com
首页 > 其他好文 > 详细

图的广度优先遍历

时间:2018-10-27 13:18:37      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:链表   src   front   cst   颜色   之间   type   empty   push   

广度优先遍历指算法始终是将已发现节点和未发现节点之间的边界沿广度方向向外扩展,也就是,算法在发现和源节点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\n", u->m_cId, u->m_iDistance, u->m_iParent);
    }
}


int main()
{
    stGraph graph;

    graph.init();
    graph.bfs(1);

    return 0;
}

 

技术分享图片

以这个图为例,c++代码:

图的广度优先遍历

标签:链表   src   front   cst   颜色   之间   type   empty   push   

原文地址:https://www.cnblogs.com/zuofaqi/p/9860566.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!