DFS深度优先搜索遍历的基本思想是:首先访问出发点v,并将其标记为已访问过,然后选取与v相邻的未被访问的任一个顶点w,并访问它;再选取与w邻接的未被访问的任一顶点并访问,以此反复进行。
BFS广度优先搜索遍历的基本思想是:首先访问起始顶点v,然后选取与v邻接的全部顶点w1、w2、...进行访问,再依次访问与w1、w2、...邻接的全部顶点(已经访问过的顶点除外),依次类推,知道全部顶点已经被访问过为止。
#include<stdio.h>
void DFS(ALGraph *G,int v) //图以连接表存储,从顶点v开始遍历
{
ArcNode *p;
visit(v); //访问顶点v
visit[v] = 1; //置已访问标记
p = G->adjlist[v].firstarc;
while(p != NULL){
if(!visit[p->adjvex])
DFS(G,p->adjvex);
p = p->nextarc; //p指向顶点v的下一条邻接边
}
}
//广度优先搜索遍历需要借助一个队列
void BFS(ALGraph *G,int v)
{
ArcNode *p;
int que[MAXSIZE],front = 0,rear = 0;
int j;
Visit(v);
vist[v] = 1;
rear = (rear + 1) % MAXSIZE;
que[rear] = v;
while(front != rear){
front = (front + 1) % MAXSIZE;
j = que[front];
p = G->adjlist[j].firstarc;
while(p != NULL){
if(!visit[p->adjvex]){
Visit(p->adjvex);
visit[p->adjvex] = 1;
rear = (rear + 1) % MAXSIZE;
que[rear] = p->adjvex;
}
p = p->nextarc;
}
}
}