# • DFS:
### • 全名:Depth-First-Search,中文名:深度优先搜索。
### • 算法简要过程:对每一个可能的分支路径深入到不能再深入为止,而且每个节 点只能访问一次。简单的说就是一次性走到无路可走再返回上一步在往下走到无路可走
## 图的dfs
![](https://box.kancloud.cn/0a8d6a1e306937ae9082ebedf68ce2a9_619x570.png)
### 模板
`void dfs(答案,搜索层数,其他参数){
if(层数==maxdeep){
更新答案;
return;
}
(剪枝)
for(枚举下一层可能的状态){
更新全局变量表示状态的变量;
dfs(答案+新状态增加的价值,层数+1,其他参数);
还原全局变量表示状态的变量;
}
}`
## 进入正题
#### 1.dfs遍历图
之前的图大家也看了,我们发现dfs可以遍历一张图
从图中某个顶点v出发,首先访问v;访问结点v的第一个邻接点,以这个邻接点vt作为一个新节点,访问vt所有邻接点。直到以vt出发的所有节点都被访问到,回溯到v的下一个未被访问过的邻接点,以这个邻结点为新节点,重复上述步骤,直到图中所有与v相通的所有节点都被访问到。若此时图中仍有未被访问的结点,则另选图中的一个未被访问的顶点作为起始点。重复该过程,直到图中的所有节点均被访问过。
用一个b数组记录该点是否被访问过。
`
#include<bits/stdc++.h>
using namespace std;
struct Edge
{
int to,w,next;
}edge[100001];
int k,n,m,x,y,z,sum=0,b[100001],head[100001];
inline void add(int u,int v,int w)//领接链表建图
{
edge[++k].to=v;
edge[k].w=w;
edge[k].next=head[u];
head[u]=k;
}
void dfs(int u)//dfs遍历,u表示当前所在的起点编号
{
sum++;
if(sum==n)return;
for(register int i=head[u];i;i=edge[i].next)
if(!b[edge[i].to])
{
b[edge[i].to]=1;
dfs(i);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(register int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
for(register int i=1;i<=n;i++)
if(!b[i])dfs(i);
return 0;
}
`
- 简介
- 零基础快速入门ACM
- C语言快速入门
- C语言快速入门
- C/C++基础
- 输入输出
- 数组和字符串
- 数组
- 字符数组
- 函数和递归
- C++标准容器库(STL)
- Vector
- Map
- Set
- String
- Stack
- Queue
- Priority_queue
- 贪心
- 硬币问题
- 区间调度问题
- 字典序最小问题
- 独木舟问题
- 搜索
- DFS
- BFS
- 剪枝
- 记忆化搜索
- 常用技巧
- 倍增
- 高精度
- 大数加法
- 大数减法
- 大数乘法
- 大数除法
- 大数阶乘
- 输入挂
- 前缀和
- 二分
- 本地预处理
- 尺取
- 枚举
- 坐标离散化
- 分治
- 数列分治
- 树上分治
- 平面分治
- 计算几何
- 凸包
- 点积
- 叉积
- 线段关系
- 皮克定理
- 最近点对
- 数据结构
- 线段树
- 树状数组
- 并查集
- 动态规划
- 基础知识
- 信息学竞赛中的动态规划
- 动态规划初步
- 最长上升子序列(LIS)
- 最长公共子序列(LCS)
- 最大子段和
- 背包问题
- 部分背包
- 0 1 背包
- 完全背包
- 多重背包
- 背包的可行性问题
- 线性DP
- 树形DP
- 区间DP
- 数位DP
- 动态规划优化
- 字符串
- KMP算法
- 拓展KMP
- 字符串Hash
- Manacher算法
- 后缀数组
- Trie树
- 博弈论
- Nim博弈
- Bash博弈
- 斐波那契博弈
- 威佐夫博弈
- SG函数
- 数论
- 整数研究
- 素数判断
- 素数筛选
- 快速幂
- 算数基本定理
- 最大公约数(Gcd)
- 费马小定理
- 扩展欧几里得
- 逆元
- 同余定理
- 组合数学
- 容斥原理
- 抽屉原理
- 卢卡斯(Lucas)
- 卡特兰(Catalan)
- 著名函数
- 欧拉函数
- 莫比乌斯函数
- 线性代数
- 矩阵运算
- 矩阵快速幂
- 图论
- 存图方法
- 邻接矩阵
- 邻接表
- Vector存图
- 链式前向星
- 图的遍历
- 拓扑排序
- 最短路
- Dijkstra算法
- SPFA算法
- Floyed 算法
- 最小生成树
- Prim算法
- Kruskal算法
- 最近公共祖先 (LCA)
- 二分图匹配
- 网络流
- 其他
- 莫队