C++实现广度优先遍历图

 更新时间:2021年09月16日 15:58:56   作者:Kayla小可爱  
这篇文章主要为大家详细介绍了C++实现广度优先遍历图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C++实现广度优先遍历图的具体代码,供大家参考,具体内容如下

广度优先遍历

void bfs(int start, int parent[], int dist[], int seen[], int visited[]) {
    std::queue <int> q;//建立数据队列q
    int v;
    
    q.push(start);    //让开始序列入栈
    parent[start] = start;      // 开始节点的父节点是开始节点
    dist[start] = 0;            // 初始化距离向量为-1
    seen[start] = 1;       

    while(!q.empty()) {         //如果队列非空
        v = q.front(); q.pop();   //令V是队列的最前端,并将其出栈
        if(visited[v])          // 如果visited[v]=1, continue.
            continue;
        visited[v] = 1;         //否则令visited[v]=1
        std::cout << v << '\n';//输出显示当前节点

        // 遍历v的所有相邻节点
        for(int i = 0; i < graph[v].size(); i++) {
            // 如果v的第i个相邻节点的i并没有访问过
            if(!visited[graph[v][i]]) {

                // 如果这个没有访问过的节点没有被看过
                if(!seen[graph[v][i]]) {
                //压入栈,距离+1,设置父节点
                    q.push(graph[v][i]);
                    dist[graph[v][i]] = 1 + dist[v];
                    parent[graph[v][i]] = v;
                    // 如果已经访问过,令seen=1.
                    seen[graph[v][i]] = 1;
                }
            }
            else {

                // 如果节点已经被访问了,选择距离最小的
                if(dist[v] + 1 < dist[graph[v][i]]) {
                    dist[graph[v][i]] = 1 + dist[graph[v][i]];
                    parent[graph[v][i]] = v;
                }
            }
        }
    }
}

主函数

int main() {

    int n = 8;          // 图中的节点数
    graph = std::vector <std::vector <int> > (n);
    
    // 图的邻接表
    graph[0] = {1, 2};
    graph[1] = {0, 2, 3};
    graph[2] = {0, 1, 5, 6};
    graph[3] = {1, 2, 4};
    graph[4] = {3};
    graph[5] = {2};
    graph[6] = {2, 7};
    graph[7] = {6};

    /* - parent[i] = parent of 'i' in BFS traversal.
       - dist[i] = 从开始到I节点的最短距离shortest distance of 'i' from 'start'.
       - If seen[i] == 1, 节点i已经进入过队列'i' has entered the queue once
       - If visited[i] == 1, 节点i已经进入队列,并且所有相邻节点都已经进入过队列
    */
    int parent[n+1], dist[n+1], seen[n+1], visited[n+1];
    memset(parent, -1, sizeof(parent));//父节点初始化为-1
    memset(dist, -1, sizeof(dist));//距离向量初始化为-1
    memset(seen, 0, sizeof(seen));
    memset(visited, 0, sizeof(visited));//seen用于判断该节点是否访问过

    int start = 0;      // 开始节点
    bfs(start, parent, dist, seen, visited);

    return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C/C++宽窄字符转换与输出的多种实现方法

    C/C++宽窄字符转换与输出的多种实现方法

    本文主要介绍了C/C++宽窄字符转换与输出的多种实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C++学习小结之数据类型及转换方式

    C++学习小结之数据类型及转换方式

    本文给大家分享的是本人在学习C++过程中的一个小心得,关于数据类型和转换方式的,这里记录下来,推荐给菜鸟们,高手大神请直接飘过。
    2015-07-07
  • C++实现简单遗传算法

    C++实现简单遗传算法

    这篇文章主要介绍了C++实现简单遗传算法,以实例形式较为详细的分析了遗传算法的C++实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-05-05
  • C语言二维数组运用实现扫雷游戏

    C语言二维数组运用实现扫雷游戏

    这篇文章主要为大家详细介绍了C语言二维数组运用实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 基于C++实现五子棋小游戏

    基于C++实现五子棋小游戏

    这篇文章主要为大家详细介绍了基于C++实现五子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C语言实现歌手大奖赛计分程序

    C语言实现歌手大奖赛计分程序

    这篇文章主要为大家详细介绍了C语言实现歌手大奖赛计分程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C语言实现商品管理系统开发

    C语言实现商品管理系统开发

    这篇文章主要为大家详细介绍了C语言实现商品管理系统开发,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C/C++字符串函数之复制函数详解

    C/C++字符串函数之复制函数详解

    下面小编就为大家带来一篇C/C++字符串函数之复制函数详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • C语言实现扫雷游戏及其优化

    C语言实现扫雷游戏及其优化

    这篇文章主要为大家详细介绍了C语言实现扫雷游戏及其优化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • C++如何用数组模拟链表

    C++如何用数组模拟链表

    大家好,本篇文章主要讲的是C++如何用数组模拟链表,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01

最新评论