当年老师给我们讲这里的时候,讲的真是云里雾里的。
。其实画个图就很容易理解的事情,为什么扯那么远
我觉得 DFS其实就是树的先序遍历的强化版本
BFS是层序遍历的强化
只不过 图的实现方式比较多元化 而且不像二叉树有明确的根
操作起来相对难一些
理论其实很好理解 就是具体操作起来 每次都很晕的样子
眼高手低了又。
图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。图的遍历操作和树的遍历操作功能相似。图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上。
由于图结构本身的复杂性,所以图的遍历操作也较复杂,主要表现在以下四个方面:
① 在图结构中,没有一个“自然”的首结点,图中任意一个顶点都可作为第一个被访问的结点。
② 在非连通图中,从一个顶点出发,只能够访问它所在的连通分量上的所有顶点,因此,还需考虑如何选取下一个出发点以访问图中其余的连通分量。
③ 在图结构中,如果有回路存在,那么一个顶点被访问之后,有可能沿回路又回到该顶点。
④ 在图结构中,一个顶点可以和其它多个顶点相连,当这样的顶点访问过后,存在如何选取下一个要访问的顶点的问题。
显然,这是一个递归的过程。为了在遍历过程中便于区分顶点是否已被访问,需附设访问标志数组visited[0:n-1],
,其初值为FALSE ,一旦某个顶点被访问,则其相应的分量置为TRUE。
从图的某一点v
出发,递归地进行深度优先遍历的过程如下:
void DFS(Graph G,int v ) { /*从第v 个顶点出发递归地深度优先遍历图G*/ visited[v]=TRUE;VisitFunc(v); /*访问第v 个顶点*/ for(w=FisrAdjVex(G,v);w; w=NextAdjVex(G,v,w)) if (!visited[w]) DFS(G,w); /*对v 的尚未访问的邻接顶点w 递归调用DFS*/ }
void DFSTraverseAL(ALGraph *G) {/*深度优先遍历以邻接表存储的图G*/ int i; for (i=0;i<G->n;i++) visited[i]=FALSE; /*标志向量初始化*/ for (i=0;i<G->n;i++) if (!visited[i]) DFSAL(G,i); /*vi 未访问过,从vi 开始DFS 搜索*/ }/*DFSTraveseAL*/
<pre name="code" class="cpp">void DFSAL(ALGraph *G,int i) {/*以Vi 为出发点对邻接表存储的图G 进行DFS 搜索*/ EdgeNode *p; printf("visit vertex:V%c\n",G->adjlist[i].vertex);/*访问顶点Vi*/ visited[i]=TRUE; /*标记Vi 已访问*/ p=G->adjlist[i].firstedge; /*取Vi 边表的头指针*/ while(p) /*依次搜索Vi 的邻接点Vj,j=p->adjva*/ { if (!visited[p->adjvex]) /*若Vj 尚未访问,则以Vj 为出发点向纵深搜索*/ DFSAL(G,p->adjvex); p=p->next; /*找Vi 的下一个邻接点*/ } }/*DFSAL*/
void BFSTraverse(Graph G, Status(*Visit)(int v)) {/*按广度优先非递归遍历图G。使用辅助队列Q 和访问标志数组visited*/ for (v=0;v<G,vexnum;++v) visited[v]=FALSE; InitQueue(Q); /*置空的国债队列Q*/ if (!visited[v]) /*v 尚未访问*/ {EnQucue(Q,v); /*v 入队列*/ while (!QueueEmpty(Q)) { DeQueue(Q,u); /*队头元素出队并置为u*/ visited[u]=TRUE; visit(u); /*访问u*/ for(w=FistAdjVex(G,u); w; w=NextAdjVex(G,u,w)) if (!visited[w]) EnQueue(Q,w); /*u 的尚未访问的邻接顶点w 入队列Q*/ } } }/*BFSTraverse*/
void BFSTraverseAL(MGraph *G) {/*广度优先遍历以邻接矩阵存储的图G*/ int i; for (i=0;i<G->n;i++) visited[i]=FALSE; /*标志向量初始化*/ for (i=0;i<G->n;i++) if (!visited[i]) BFSM(G,i); /* vi 未访问过,从vi 开始BFS 搜索*/ }/*BFSTraverseAL*/
void BFSM(MGraph *G,int k) {/*以Vi 为出发点,对邻接矩阵存储的图G 进行BFS 搜索*/ int i,j; CirQueue Q; InitQueue(&Q); printf("visit vertex:V%c\n",G->vexs[k]); /*访问原点Vk*/ visited[k]=TRUE; EnQueue(&Q,k); /*原点Vk 入队列*/ while (!QueueEmpty(&Q)) {i=DeQueue(&Q); /*Vi 出队列*/ for (j=0;j<G->n;j++) /*依次搜索Vi 的邻接点Vj*/ if (G->edges[i][j]==1 && !visited[j]) /*若Vj 未访问*/ {printf("visit vertex:V%c\n",G->vexs[j]); /*访问Vj */ visited[j]=TRUE; EnQueue(&Q,j); /*访问过的Vj 入队列*/ } } }/*BFSM*/
原文地址:http://blog.csdn.net/rainxbow/article/details/43900825