图 —— 图的遍历搜索

深度优先搜索遍历

图的深度优先搜索遍历类似于二叉树的先序遍历。它的基本思想是:首先访问出发点 v,并将其标记为已访问;然后选取与 v 邻接的未被访问的任意一个顶点 w,并访问它;再选取与 w 邻接的未被访问的任一顶点并访问,以此重复进行。

在这里插入图片描述

实现

int visit[maxSize];	//全局变量,用于存储结点是否被访问
void DFS(AGraph *G,int v)	//参数:图G和访问点的编号v
{
	ArcNode *p;
	visit[v]=1;	// 设置为已访问
	Visit(v);	//	对结点进行访问
	p=G->adjlist[v].firstarc;	//	指向结点v对应的第一条边
	while(p!=NULL)
	{
		if(visit[p->adjvex]==0)	//	若结点未访问,则递归访问
		{
			DFS(G,p->adjvex);	//	递归,p->adjvex 边所指向的结点的位置
		}
		p=p->nextarc;	//	 p的下一条边
	}
}

广度优先搜索遍历

图的广度优先搜索遍历类似于树的层次遍历。它的基本思想是:首先访问出发点 v ,然后选取与 v 邻接的全部顶点 w1,…,wn 进行访问,再依次访问与 w1,…,wn 邻接的全部顶点(已经访问过的除外),以此类推,直到所有顶点都被访问过为止

在这里插入图片描述

实现

int visit[maxSize];	//全局变量,用于存储结点是否被访问
void BFS(AGraph *G,int v)
{
	visit[v]=1;
	Visit(v);
	int que[maxSize];	//	创建队列
	int front=0;
	int rear=0;
	rear=(rear+1)%maxSize;	//	结点入队
	que[rear]=v;
	int j;
	ArcNode *P;
	while(front!=rear)	//	队空时则遍历完成
	{
		front=(front+1)%maxSize;	//	结点出队
		j=que[front];	
		p=AGraph->adjlist[j].firstarc	//	结点j的单链表对应的第一条边
		while(p!=NULL)
		{
			if(visit[p->adjvex]==0)
			{
				visit[p->adjvex]=1;
				Visit(p->adjvex);
				rear=(rear+1)%maxSize;	//	结点入队
				que[rear]=p->adjvex;
			}
			p=p->nextarc;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/starter_____/article/details/93476087