IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 图的遍历:深度优先遍历(DFS) -> 正文阅读

[数据结构与算法]图的遍历:深度优先遍历(DFS)

深度优先遍历(Depth First Search)

深度优先遍历类似于树的先序遍历

1.深度优先搜索遍历连通图

在无向图中任意两个顶点都是连通的(可以不是直接相连),则称该图为连通图

假设从顶点 V 1 V_1 V1?出发,访问序列为
V 1 → V 2 → V 3 → V 4 → V 3 ( 已 访 问 ) → V 5 V_1 \rightarrow V_2 \rightarrow V_3 \rightarrow V_4 \rightarrow V_3(已访问) \rightarrow V_5 V1?V2?V3?V4?V3?(访)V5?

bool visited[MVNum];	//标记顶点是否被访问过,其初值为"false"
void DFS(Graph G, int n){	//传入有n个顶点的连通图G
	cout << v;	//输出图中某个顶点在数组中的下标
	visited[v]=true;	//访问第v个顶点,并置访问标志数组相应值为true
	for(w=FirstAdjVex(G,v); w>=0; w=NextAdjVex(G,v,w))	//这里的FirstAdjVex和NextAdjVex没有具体展开。如果图的存储结构不同,这两个的实现方法不同
	//依次检查v的所有邻接点w
	//FirstAdjVex(G,v)表示v的第一个邻接点
	//w>=0表示存在邻接点
	//NextAdjVex(G,v,w)表示v的相对于w的下一个邻接点
		if(!visited[w])
			DFS(G,w);	//对v的尚未访问的邻接顶点w递归调用DFS
}

2.深度优先搜索遍历非连通图


连通分量
下面两个图是上面非连通图的两个连通分量

每调用一次上面遍历连通图的算法,有多少次调用,就说明图中有多少个连通分量
(将非连通图分解为连通分量,分别进行遍历)

void DFSTraverse(Graph G){	//传入非连通图G
	for(v=0; v<G.vexnum; ++v)
		visited[v]=false;	//访问标志数组初始化
	for(v=0; v<G.vexnum; ++v)
		if(!visited[v]) 	//循环调用上面遍历连通图的算法DFS
			DFS(G,v);		//对未访问的顶点进行访问
}

3.深度优先搜索遍历以结构为邻接矩阵的图

无向图

有向图

DFS只是对通道是否存在进行判断,对无向图和有向图算法上没有变化,完全通用

void DFS_AM(AMGraph G, int v){	//传入有向/无向图、第一个要访问的顶点在一维数组中的下标
	cout << v;	//输出某个顶点在一维数组中的下标
	visited[v]=true;	//访问第v个顶点,并置访问标志数组相应值为true
	for(w=0; w<G.vexnum; w++)	//依次检查邻接矩阵v所在行
		if((G.arcs[v][w] != 0) && (!visited[w]))
			DFS_AM(G,w);	//递归遍历未访问的顶点
}

4.深度优先搜索遍历以结构为邻接表的图

无向图

有向图

void DSL_AL(ALGraph G, int v){
	cout << v;	//输出某个顶点在一维数组中的下标
	visited[v]=true;	//访问第v个顶点,并置访问标志数组相应值为true
	p=G.vertices[v].firstarc;	//将下标为v的顶点的第一邻接点指针域命名为p
	while(p != NULL){	//下标为v的顶点的第一邻接点非空
		w=p->adjvex;	//p所指结点的数据域,该数据域是顶点在一维数组中的下标,将该下标赋值给w
		if(!visited[w])	//下标为w的顶点未访问过
			DSL_AL(G,w);	//递归遍历
		p=p->nextarc;	//现在用p指向p->nextarc所指的结点,以便下一次遍历时使用p
	}
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-15 15:50:18  更:2021-08-15 15:52:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:18:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码