数据结构-图的遍历

图的遍历是指图从图中的某一定点出发, 按照某种搜索方法沿着图中的边对图中的所有顶点访问一次且仅访问一次。

一、广度优先遍历(Breadth-First-Search,BFS)
广度优先遍历的基本思想:首先访问起始顶点v,接着由v出发,一次访问v的各个未访问过的邻接顶点w1,w2,w3,……wi,然后再依次访问w1,w2,w3,……wi的所有未被访问过的邻接顶点;再从这些访问过得顶点出发,再访问他们所有未被访问过的邻接顶点,依次类推,直到图中所有的顶点都被访问过为止。
算法的时间复杂度为O(n^2),n为顶点数

    bool visited[MAX_VERTEX_NUM];//访问标记数组
    void BFSTraverse(Graph G)    //对图G进行广度优先遍历,设访问函数为visit()
    {
        for(i=0;i<G.vexnum,i++)
            visited[i]=FALSE;   //访问标记数组初始化
        InitQuene(Q);           //初始化辅助队列Q
        for(i=0;i<G.vernum;i++)//从0号顶点开始遍历
        if(!visited[j])       //对于每个连通分量调用依次BFS
            BFS(G,i);       //vi未访问过,从vi开始BFS
    }
    void BFS(Graph G,int v)  //从顶点v出发,遍历图G,算法借助一个辅助队列Q
    {
        visit(v);            //访问初始顶点v
        visited[v]=TRUE;     //对v做已访问标记
        Enqueue(Q,v);        //顶点v入队列
        while(!isEmpty(Q))
        {
            DeQueue(Q,v);    //顶点v出队列
            for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
                            //检测v所有邻接点
            if(!visited[w]) //w为v的尚未访问的邻接顶点
            {
                visit(w);   //访问顶点w
                visited[w]=TRUE;//对w做已访问标记
                EnQueue(Q,w);   //顶点w入队列
            }
        }
    }

二、深度优先遍历
深度优先遍历的基本思想:首先访问图中某一起点v,然后由v出发,访问与v邻接且未被访问的任一顶点w1,再访问与w1邻接且为别访问的任一顶点w2,重复此过程,当不能再继续向下访问时,再依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直到图中所有顶点均被访问过。

bool visited[MAX_VERTEX_NUM];    //访问标记数组
    void DFSTraverse(Graph G)    //对图G进行深度优先遍历,设访问函数为visit()
    {
        for(v=0;v<G.vexnum,++v)
            visited[v]=FALSE;   //初始化已访问标记数据
        for(v=0;v<G.vernum;++v)//从v=0开始遍历
        if(!visited[v])       
            DFS(G,v);       
    }
    void DFS(Graph G,int v)  //从顶点v出发,采用递归思想深度优先遍历图G
    {
        visit(v);            //访问初始顶点v
        visited[v]=TRUE;     //对v做已访问标记
        for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
            if(!visited[w]) //w为u的尚未访问的邻接顶点
            {
                DFS(G,w);   //顶点w入队列
            }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值