数据结构——图的遍历之深度优先遍历(DFS算法)_全世界最可爱的王小帅_CSDN博客

本文详细介绍了图的深度优先遍历(DFS)算法,从概念到步骤,再到算法思想,以及使用邻接矩阵和邻接表的实现。重点强调了在遍历过程中邻接点顺序的一致性,并分析了DFS的时间复杂度,指出在稠密图中使用邻接矩阵,稀疏图中使用邻接表的优化策略。
摘要由CSDN通过智能技术生成

数据结构——图的遍历之深度优先遍历

图的遍历一般分为深度优先遍历和广度优先遍历

下面我们要说的是深度优先遍历**(DFS算法)**
1,我们首先选择一个顶点作为起始点,假设我们选择顶点v作为起始点,首先访问v,然后找v的邻接点,访问v的一个还未被访问过邻接点w1,

2,再以w1为起始点,然后去找w1的邻接点,访问w1的一个还未被访问过的邻接点w2,再以w2作为起始点继续往下访问…

3,如果我们访问到一个顶点,以他作为起始点选择他的邻接点时发现他的邻接点全部都被访问过或者说他没有邻接点了,这个时候就返回到这个顶点的上个顶点,以上个顶点作为起始点继续访问。

我们假设访问完w9之后,发现w9的邻接点全部都被访问过或者w9没有邻接点了,那这个时候我们就返回到w9的上个顶点w8,以w8作为起始点继续往下访问,如果w8也没有未被访问的邻接点了,那就再返回上个顶点w7,以此类推,直到所有的顶点都被访问一遍为止。
在这里插入图片描述
这里值得注意的是 我们以一个顶点为起始点去找他的邻接点的顺序一定要统一,
比如说上题以2为起始点,我们选择1为他的第一个邻接点去访问1,然后再以1为起始点,1的邻接点有3和4 由于以2为起始点的时候选择1作为第一起始点顺序是按从小到大的,那我们以1为起始点的时候就要首先选择访问3,有更多个邻接点依旧如此,第一第二第三…邻接点的顺序要从小到大都按从小到大,要从大到小都按从大到小。

出现这种情况原因主要是因为在写代码的时候,访问下个邻接点的代码是一样的,每次都是执行相同的语句,所以顺序都是统一的。

【算法思想】

1,设立一个辅助数组visited[i]来储存已经被访问过的顶点
2,确定一个起始点v,输出v,并将v放入数组visitde之中
3,利用循环语句去寻找v的第一个邻接点w,判断w是否被访问过即visited[w]是否为0
4,若w未被访问过即visited[w]=0,则以w为新的起始点重复2,3
若w已经被访问过了 则继续找v未被访问过的邻接点,重复以上步骤
5,如果我们在找一个顶点的邻接点时其没有邻接点或者所有的邻接点都已经被访问过,则返回上个顶点重复以上步骤

综上,我们可以用递归的方式

邻接矩阵储存图结构的DFS算法
在这里插入图片描述

#include<iostream>
using namespace std;
#define imax 9999
#define max 100
#define true 1
#define false 0
typedef char dingdian;
typedef int quanzhi;
typedef struct{
   
	dingdian dd[max];//建立顶点表
	quanzhi lj[max][max];//创建邻接矩阵
	int ds,bs;//顶点数和边数

}Tu;
int look(Tu G,dingdian v)//寻找顶点下标的函数
{
   
	int i;
	for(i=0;i<G.ds;i++)
	{
   
		if(G.dd[i]==v)
		return i;
	}
}
void creattree(Tu &G)//建立图G
{
   
	int i,j,k;
	dingdian v1,v2;
	quanzhi a;
	cin>>G.ds>>G.bs;//输入顶点数和边数
	for(i=0;i<G.ds;i++)
	{
   
		cin>>G.dd[i];//输入顶点信息
	}
	for(i=0;i<G.ds;i++)
	{
   
		for(j=0;j<G.ds;j++)
		{
   
			G.lj[i][
  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值