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

图的遍历

时间:2015-10-19 17:00:13      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

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

1 深度优先遍历——DFS

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

                            技术分享

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

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

void DFS(AGraph *g,int v)
{
    Edge *p;
    visit[v]=1;
    printf("%d\n",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\n",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\n",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 }

 

图的遍历

标签:

原文地址:http://www.cnblogs.com/wktwj/p/4892297.html

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