22.7.24 树和图的深度优先遍历
1、树和图的存储
树是一种特殊的图,无环连通图,所以图和树一样的存储。图有两种,分为有向图和无向图。由于bool (a–> b &&a<-- b == a – b) = 1,所以,无向图就是一种特殊的有向图,即无向图可以存储为a–> b &&a<-- b的有向图。所以只用考虑有向图的处理与存储。
有向图的两种存储方式:
邻接矩阵
用一个二维矩阵来存储 g[a][b]表示a --> b的一条路
无权重为0 or 1的bool值,
有权重为权值
用的比较少,浪费空间,空间复杂度O(n^2),适合稠密的图
邻接表
每一个节点都是一个单链表,存储这个点可以走到哪一个点
主要的存储方式
2、树和图的遍历
有深度优先遍历(bfs)和宽度优先遍历(dfs)两种。
dfs模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 #include <iostream> #include <algorithm> #include <cstring> using namespace std;const int N = 100010 , M = N*2 ;int h[N],e[N],en[N],idx;void add (int a,int b) { e[idx] = b; en[idx ] = h[a]; h[a] = idx++; } void dfs (int u) { st[u] = true ; for (int i = h[u]; i != -1 ; i = en[i]) { int j = e[i]; if (!st[j]) dfs (j); } } int main () { memset (h,-1 ,sizeof h); return 0 ; }
22.7.25 dfs 深度优先搜索算法
1、什么是深搜
2、模板 不像bfs不用队列
1 2 3 4 5 6 7 8 9 10 11 12 int h[N],e[N],en[N],idx; void dfs (int u) { st[u] = true ; for (int i = h[u]; i != -1 ; i = en[i]) { int j = e[i]; if (!st[j]) dfs (j); } }
3、要点解释
4、Q&A总结