图的遍历(bfs和dfs)

1.深度优先搜索

深度优先搜索遍历与树的先序遍历类似,从某个点出发,寻找其第一个未访问过的邻接点,访问该点并以该点为起点寻找其第一个未访问过的邻接点,同时申请一个一维数组,对每一个点若其已经被访问过则将该点在数组中对应的值置为1。这个过程通过递归来实现

若图借助邻接矩阵法表示,dfs的实现代码如下

void DFS(AMGraph G,int v)//从第几个点开始搜索 
{
	cout<<G.vexs[v]<<endl;
	visited[v]=1;
	for(int i=0;i<G.vexnum;i++)
	{
		if((!visited[i])&&(G.arcs[v][i]!=maxint))
		DFS(G,i);
	}
	
}

若图借助邻接表法表示

void DFS(ALGraph G,int v)//从第几个点开始搜索 
{
	cout<<G.vertices[v].name<<endl;
	visited[v]=1;
	int w;
	Arcnode *t;
	t=G.vertices[v].firtstarc;
	while(t!=NULL)
	{
		w=t->p;
		if(!visited[w])
		DFS(G,w);
		else
		t=t->next;
	}
}

在t指针未指到单链表终点之前若找到未被访问过的点,则从该点开始继续搜索。若指到终点,则搜索结束,连通图中的每一个点均被访问到。

2.广度优先搜索

广度优先搜索与树的层序遍历类似,遍历从某一个节点开始,查看它的所有邻接点,若邻接点未被访问则访问该点并将该点加入队列;当前一个点的所有邻接点都被访问完后,再弹出队列的首元素查看它的所有邻接点。

图的广度优先搜索的代码如下(以邻接表法为例)

void BFS(ALGraph G,int v)
{
	cout<<G.vertices[v].name<<' ';
	Q.push(v);
	visited[v]=1;
	int i,k;
	Arcnode *j;
	while(!Q.empty())
	{
		i=Q.front();//返回队列头元素的值 
		Q.pop();//队头元素出队
		j=G.vertices[i].firtstarc;
		while(j!=NULL)
		{
			k=j->p;
			if(!visited[k])
			{
				cout<<G.vertices[k].name<<' ';
				visited[k]=1;
				Q.push(k);
			}
			j=j->next;
		} 
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值