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)

前要

树的先根遍历

学习图的深度优先遍历 (DFS),先复习下 树的深度优先遍历(这里以先根遍历为例)

//树的先根遍历
void PreOrder(TreeNode *R*){
	if(R!=NULL){
		visit(R); //访问根节点
		while(R还有下一个子树T){
			PreOrder(T);  //先根遍历下一颗子树
		}
	}
}

新找到的相邻接点一定是没有访问的。

图的深度优先遍历

这里的 FirstNeighbor(G,v)NextNeighbor(G,v,w) 同上文 方法说明

bool visited[MAX_VERTEX_NUM]; //访问标记数组
void DFS(Graph G,int v){  //访问标记数组
	visit(v); //从顶点v出发,深度优先遍历图G
	visited[]=TRUE;  //设已访问标记
	for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w)){ 
			if(!visited[w]){  //w为u的尚未访问的邻接顶点
				DFS(G,w);
		}
	}
}

算法存在的问题

如果是非连通图,则无法遍历完所有结点

bool visited[MAX_VERTEX_NUM]; //访问标记数组

void DFSTrave(Graph G){
	for(v=0;v<G.vexnum;v++){
		visited[v]=FALSE;
	}
	for(v=0;v<G.vexnum;v++){
		if(!visited[i]){
			DFS(G,v);
		}
	}
}

void DFS(Graph G,int v){  //访问标记数组
	visit(v); //从顶点v出发,深度优先遍历图G
	visited[]=TRUE;  //设已访问标记
	for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w)){ 
			if(!visited[w]){  //w为u的尚未访问的邻接顶点
				DFS(G,w);
		}
	}
}

算法复杂度分析

时间复杂度=访问各节点所需时间 + 探索各条边所需时间

邻接矩阵

  1. 访问 ∣ V ∣ |V| V个顶点需要 O ∣ V ∣ O|V| OV的时间
  2. 查找每个顶点的邻接点都需要 O ( ∣ V ∣ ) O(|V|) O(V)的时间,而总共有|V|个结点,时间复杂度= O ( ∣ V ∣ 2 ) O(|V|^2) O(V2)

邻接表

  1. 访问|V|个顶点需要 O(|V|) 的时间
  2. 查找各个顶点的邻接点共需要 O ( ∣ E ∣ ) O(|E|) O(E)的时间,时间复杂度为: O ( ∣ V ∣ + ∣ E ∣ ) O(|V|+|E|) O(V+E)

注意:

  1. 同一个图的邻接矩阵表示方式唯一,因此深度优先遍历序列唯一
  2. 同一个图的邻接表表示方式不唯一,因此深度优先遍历序列不唯一

深度优先生成树

  1. 同一个图的邻接矩阵表示方式唯一,因此深度优先遍历序列唯一深度优先生成树也唯一
  2. 同一个图的邻接表表示方式不唯一,因此深度优先遍历序列不唯一深度优先生成也不唯一

树节点示意图

生成树示意图

深度优先生成森林

广度优先生成森林 一样

在这里插入图片描述

图的遍历与图的连通性

  1. 对无向图进行 BFS/DFS 遍历,调用 BFS/DFS 次数=连通分量数
    1. 对于连通图,只需调用 1 次 BFS/DFS
  2. 对有向图进行 BFS/DFS 遍历,调用 BFS/DFS 次数要具体分析
    1. 若起始顶点到其他各顶点都有路径,则只需要调用 1 次 BFS/DFS 函数
  3. 对于强连通图,从任一结点出发都只需要调用 1 次 BFS/DFS。
    无向图&连通图

有向图&强连通图

知识回顾与重要考点

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-06-23 00:59:44  更:2022-06-23 00:59:57 
 
开发: 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/26 1:49:50-

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