宽度搜索和深度搜索
知识点总结报告模板
知识点:
宽度搜索
(原理)宽度搜索也是广度优先遍历
广度优先遍历的过程是首先访问初始点v,接着访问顶点v的所有未被访问过的领接点v1,v2,...,vt,然后再按照v1,v2,...,vt的次序访问每一个顶点的所有未被访问过的领接点,依次类推,直到图中所有和初始点v有路径相通的顶点都被访问过为止。
以领接表为存储结构,在用广度优先遍历图时需要使用一个队列,这里采用环形队列,以类似于二叉树的层次遍历方式来遍历图。算法如下(v是初始点):
void BFS(AdjGraph *G,int v)
{ int w,i;ArcNode *p;
SqQueue *qu; //定义环形队列指针
InitQueue(qu); //初始化队列
int visited[MAXV]; //定义顶点访问标记数组
for (i=0;i<G->n;i++) visited[i]=0; //访问标记数组初始化
printf(“%2d”,v); //输出被访问顶点的编号
visited[v]=1; //置已访问标记
enQueue(qu,v);
while(!=QueueEmpty(qu)) //队不空循环
{ deQueue(qu,w); //出队一个顶点w
p=G->adjlist[w].firstarc; //指向w的第一个领接点
while(p!=NULL) //查找w的所有领接点
{ if (visited[p->adjvex]==0) //若当前领接点未被访问
{ printf(“%2d”,p->adjvex); //访问该领接点
visited[p->adjvex]=1; //置已访问标记
enQueue(qu,p->adjvex); //该顶点进队
}
p=p->nextarc; //找下一个领接点
}
}
printf(“\n”);
}
深度搜索
(原理)深度搜索又叫深度优先遍历
深度优先遍历的过程是从图的某个初始点v出发,首先访问初始点v,然后选择一个与顶点v相邻且没被访问过的顶点w,以w为初始顶点,再从它出发进行深度优先遍历,直到图中与顶点v领接的所有顶点被访问过为止,这个遍历过程是递归过程。
以领接表为存储结构的深度优先遍历算法如下(其中v是初始点,visited是一个全局数组,初始时所有元素均为0,表示所有顶点尚未被访问过):
int visited[MAX={0}; //全局数组
void DFS(AdjGraph *G,int v) //深度优先遍历算法
{ ArcNode *p;
visited[v]=1; //置已访问标记
printf(“%d”,v); //输出被访问顶点的编号
p=G->adjlist[v].firstarc; //p指向顶点v的第一个领接点
while(p!=NULL)
{ if(visited[p->adjvex); //若p->adjvex顶点未被访问,递归访问它
DFS(G,p->adjvex);
p=p->nextarc; //p指向顶点v的下一个领接点
}
}