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

    图主要有深度优先遍历(DFS)和广度优先遍历(BFS)。

    1 深度优先遍历——DFS

      深度优先类似于树的先序遍历,从要访问的节点(0)出发,选取和它相邻的任何一个节点(3),访问之,再访问和3相邻的节点(4),访问之,直到访问到没有相邻节点的节点,比如4没有相邻节点了,那么就回溯一层,访问3的未被访问的邻接节点。如图所示。直到所有的顶点均被访问。

                                

      所以深度优先就需要我们递归地检查每个顶点。

      所用的图的存储结构是上一篇中讲的邻接表存储。

    void DFS(AGraph *g,int v)
    {
        Edge *p;
        visit[v]=1;
        printf("%d
    ",v);
        p=g->adjlist[v].firstEdge;
        while(p!=NULL)
        {
            if(visit[p->adjvex]==0)
                DFS(g,p->adjvex);
            p=p->nextEdge;
        }
    }

      visit数组记录当前是否被访问。

    2 广度优先遍历——BFS

      广度优先遍历类似于树的层次遍历。以上图为例,首先访问节点0,访问和0邻接的所有节点(1、2、3),然后访问节点(1、2、3)的全部邻接节点,直到所有的节点被访问。

      所以,BFS就需要用到队列,初始时,将初始节点入队,访问队首节点,将所有和它邻接且未被访问过的节点访问并入队,顶点出队,循环上述操作,直到所有节点访问一遍(即队空)。

      总结就是——访问、所有邻接节点访问入队,出队,访问所有邻接节点入队……直到队空

      

     1 void BFS(AGraph *g,int v,int n)
     2 {
     3     Edge *p;
     4     int que[MAXSIZE];
     5     int fro=0;       //队首
     6     int rea=0;      //队尾
     7     printf("%d
    ",v);
     8     visit[v]=1;
     9     rea = (rea+1)%n;
    10     que[rea]=v;
    11     int j;
    12     while(fro!=rea)
    13     {
    14         fro=(fro+1)%n;
    15         j=que[fro];
    16         p=g->adjlist[j].firstEdge;
    17         while(p!=NULL)
    18         {
    19             if(visit[p->adjvex]==0)
    20             {
    21                 printf("%d
    ",p->adjvex);
    22                 visit[p->adjvex]=1;
    23                 rea=(rea+1)%n;
    24                 que[rea]=p->adjvex;
    25             }
    26             p=p->nextEdge;
    27         }
    28     }
    29 }
  • 相关阅读:
    测试
    扫描法作业
    线索二叉树【C语言】
    【数据结构】循环列表的基本操作
    【数据结构】C语言栈的基本操作
    [数据结构】【c语言】链表的创建和遍历
    PXC(Percona XtraDB Cluster)集群的安装与配置
    mysql数据库主从及主主复制配置演示
    基于keepalived双主模型的高可用LVS
    keepalived高可用反向代理的nginx
  • 原文地址:https://www.cnblogs.com/wktwj/p/4892297.html
Copyright © 2011-2022 走看看