图的遍历算法操作

版权声明:前半生,不害怕;后半生,不后悔! https://blog.csdn.net/qq_14842117/article/details/89342663

1.深度优先搜索遍历
图的深度优先搜索遍历(DFS)类似于二叉树的先序遍历。它的基本思想:
首先访问出发点V,并将其标记为已访问过;然后选取与V邻接的未被访问的任意一个顶点W,并访问它;在选取与W邻接的未被访问的任一顶点并访问,依次重复进行。当一个顶点的所有邻接顶点都被访问过时,则依次退回到最近被访问过的顶点,若该顶点还有其他邻接顶点未被访问,则从这些未被访问的顶点中取一个重复上述的访问过程,直至图中所有顶点都被访问过为止。

算法执行过程:任取一个顶点,访问之,然后检查这个顶点顶点所有邻接顶点,递归访问其中未被访问的顶点。
以邻接表为存储结构的图的深度优先搜索遍历算法如下:

int visit[maxSize];
/*v是起点编号,visit[]是一个全局数组,作为顶点的访问标记,初始时所有元素均为0,表示所有顶点都未被访问。因图中可能存在回路,当前经过的顶点在将来还可能再次经过,因此要对每个顶点进行标记,以免重复访问
*/
void DFS(AGraph *G,int v){
ArcNode *p;
visit[v] = 1;//置已访问标记
Visit(v);//visit函数代表了一类访问顶点v的操作
p = G->adjlist[v].firstarc;//p指向顶点v的第一条边
while(p!=null){
if(visit[p->adjvex]==0){//若顶点未访问,则递归访问它
  DFS(G,p->adjvex);//(1)
  p=p->nextarc;//p指向顶点v的下一条边的终点
    }
  }
}

与图的DFS算法对照,再次写出二叉树的先序遍历算法如下:

void preorder(btnode *p){
if(p!=null){
visit(p);
preorder(p->left);//(2)
preorder(p->right);//(3)
}
}

说明:二叉树的先序遍历代码中(2),(3)两句为递归访问当前结点的两个分支,对应于图的深度优先搜索遍历代码中就是while循环内的语句(1),实现了递归地访问当前顶点的多个分支,两者十分相似。

2.广度优先搜索遍历
图的广度优先搜索遍历(BFS)类似于树的层次遍历。它的基本思想:首先访问起始顶点v,然后选取与v邻接的全部顶点w1,wn进行访问,在依次访问与w1,wn邻接的全部顶点(已经访问过的除外),依次类推,直到所有顶点都被访问过为止。
广度优先搜索遍历图的时候,需要用到一个队列(二叉树的层数)算法执行过程可简单概括为:
1.任意图中一个顶点访问,入队,并将这个顶点标记为已访问。
2.当队列不空的时候循环执行:出队,依次检查出队顶点的所有邻接顶点,访问没有被访问过的邻接顶点并将其入队。
3.当队列为空的时候跳出循环,广度优先搜索完成。

void BFS(AGraph *G,int v,int visit[maxSize]){
//visit[]数组被初始化为全0
{
ArcNode *p;
int que[maxSize],front = 0,rear = 0;//这是定义队列的简单写法
int j;
visit(v);//任意访问顶点v的函数
visit[v]=1;
rear = (rear+1)%maxSize;//当前顶点v进队
que[rear] = v;
while(front!=rear){
  front = (front+1)%maxSize;//顶点出队
  j = que[front];
  p = G->adjlist[j].firstarc;//p指向出队顶点的第一条边
  while(p!=null){
  if(visit[p->adjvex] == 0){
   Visit(p->adjvex);
   visit[p->adjcex]=1;
   rear = (rear+1)%maxSize;//顶点出队
   que[rear] = p ->adjvex;
  }
  p = p->nextarc;//p指向j的下一条边
 }
}

}

}

以上两种遍历方法是针对连通图的。对非连通图进行遍历,只需要将上述遍历函数放在一个循环中,循环用来检测图中每一个顶点,如果当前顶点没有被访问,则调用上述函数从这个顶点遍历,否则什么都不做。
(1)深度优先搜素遍历

void dfs(AGraph *g){
int i;
for(i =1;i<=g->n;i++){
if(visit[i] ==0){
DFS(g,i);
}
}
}

2.广度优先搜索遍历

void bfs(AGraph *g){
int i;
for(i = 1;i<=g->n;i++){
 if(visit[i] ==0)
 BFS(g,i,visit);
}
}

猜你喜欢

转载自blog.csdn.net/qq_14842117/article/details/89342663