1.广度优先遍历BFS
类似于树的层次遍历。需要一个辅助队列。
王道版本:
bool visited[MAX_VERTEX_NUM];
void BFSTraverse(Graph G){
int i=0;
for(i=0;i<G.vexnum;++i){
visited[i]=FALSE;//访问数组初始化
}
InitQueue(Q);
for(i=0;i<G.vexnum;++i)
if(!visited[i])
BFS(G,i);
}
//广度优先遍历
void BFS(Graph G,int v){
visit(v);
visited[v]=TRUE;
Enqueue(Q,v);
while(!isEmpty(Q)){
DeQueue(Q,v); //顶点v出队
for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))//检测所有邻接点
{
if(!visited[w]){//w为v尚未访问的邻接顶点
visit(w); //访问w
visited[w]=TRUE; //对w做已访问标记
Enqueue(Q,w); //顶点w入队列
}//if
}//for
}//while
}
天勤版本
void BFS(AGraph *G,int v,int visit[maxsize]){
//本算法以邻接表为存储结构
ArcNode *p;
int que[maxsize],front=0,rear=0;//队列定义的简单写法
int j;
Visit(v);
visit[v]=1;
rear=(rear+1)%maxsize;
que[rear]=v;
while(front!=rear){
front=(front+1)%maxsize;//顶点出队
j=que[front];
p=G->adjlist[j].firstarc;//p指向出队顶点j的第一条边
while(p!=NULL){//将p所有邻接点中未被访问的入队
if(visit[p->adjvex]==0){//当前顶点未被访问,则进队
Visit(p->adjvex);
visit[p->adjvex]=1;
rear=(rear+1)%maxsize;//该顶点进队
que[rear]=p->adjvex;
}
p=p->nextarc;//p指向j的下一条边
}
}
}
2.深度优先搜索 DFS Depth-First-Search
类似于树的先序遍历。
王道版本
bool visited[MAX_VERTEX_NUM];
void DFSTraverse(Graph G){
int i=0;
for(i=0;i<G.vexnum;++i){
visited[i]=FALSE;//访问数组初始化
}
for(i=0;i<G.vexnum;++i)//本代码中从i=0开始访问
if(!visited[i])
DFS(G,i);
}
void DFS(Graph G,int v){
visit(v);
visited[v]=TRUE;
for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))//检测所有邻接点
{
if(!visited[w]){//w为v尚未访问的邻接顶点
DFS(G,w);
}//if
}//for
}
天勤版本
int visit[maxsize];
void DFS(AGraph *G,int v){
ArcNode *p;
visit[v]=1;
Visit(v);
p=G->adjlist[v].firstarc;
while(p!=NULL){
if(visit[p->adjvex]==0)
DFS(G,P->adjvex);
p=p->nextarc;//p指向顶点v的下一条边的终点
}
}
3.图的邻接矩阵表示是唯一的。但邻接表对边的输入次序不同,生成的邻接表也不同。
因此,基于邻接矩阵的遍历得到的DFS和BFS序列是唯一的。基于邻接表的遍历得到的序列是不唯一的。