zoukankan      html  css  js  c++  java
  • 图的遍历BFS

    图的遍历BFS

    1. 广度优先遍历
    2. 深度优先遍历

    可以进行标记

    树的广度优先遍历,我们用了辅助的队列

    bool visited[MAX_VERTEX_NUM] 	//访问标记数组
    //广度优先遍历
    void BFS(Graph G,int v){		//从顶点v出发,广度优先遍历图G
        visit(v);					//访问初始顶点v
        visited[v] = TRUE;			//对v做已访问标记
        Enqueue(Q,v);				//顶点v入队列Q
        while(!isEmpty(Q)){
            DeQueue(Q,v);			//顶点v出队列
            for(w=FirstNeighbor(G,v);w>=0;
                w=NextNeighbor(G,v.w))
                if(!visited[w]){	//w为v的尚未访问的邻接顶点
                    visit(w);		//访问顶点w
                    visited[w]=TRUE;//对w做已访问标记
                    EnQueue(Q,w);	//顶点w入队列
                }
        }
    }
    

    存在问题:如果是非连通图,则无法遍历完所有结点

    解决:判断数组里还有没有false的元素

    void BFSTraverse(Graph G){
        for(i=0;i<G.vexnum;++i)
            visited[i] = FALSE;
        InitQueue(Q);
        for(i=0;i<G.vexnum;++i){
            if(!visited[i])
                BFS(G,i);
        }
    }
    

    对于无向图来说,调用bfs函数的次数=连通分量数

    复杂度分析

    广度优先生成树

    广度优先生成森林

  • 相关阅读:
    kvm虚拟化存储管理
    k8s集群部署
    docker版的zabbix部署
    docker进阶——数据管理与网络
    docker基础
    ceph对接openstack环境
    java命令--jmap命令使用
    JVM性能分析工具jstack介绍
    SkipList跳表基本原理
    NIO之Channel、Buffer
  • 原文地址:https://www.cnblogs.com/jev-0987/p/13213415.html
Copyright © 2011-2022 走看看