先打卡一个邻接表深搜的基础模板:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010, M = N * 2;
//图的邻接矩阵基本上不用,最常用的就是邻接表存储。
//树可以看作是一种无环连通图,无向图又可以看作是双向可达的有向图
//所以所有的树和图都可以用有向图的邻接表存储法来表示
int n, m;
int h[N], e[M], ne[M], idx;
//h存的是邻接表中N个链表的链表头,e存的是当前节点的值,ne代表节点的next节点的值
//idx代表链表操作指针(这个其实没搞懂,得回去补前面的课)
bool st[N];
//深搜和宽搜每个点都只会被遍历一次,所以我们需要一个布尔数组来存储哪些点已经被遍历过
void add(int a, int b) //邻接表的插入方法,插入一条a指向b的边。其实就是在a所对应的邻接表中插入一个节点b
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void dfs(int u) //u代表当前dfs到达的点
{
st[u] = true; //标记一下,已经被搜索过了
for(int i = h[u]; i != -1; i = ne[i]) //遍历一下u的所有出边,这个遍历和遍历单链表是一模一样的
{
int j = e[i]; //j存一下当前链表里这个节点对应的图里面的点的编号是多少(图中节点的编号就是节点值)
if(!st[j]) dfs(j); //如果j没有被搜索过,那么就搜索j
}
}
int main()
{
memset(h, -1, sizeof h);
dfs(1);
return 0;
}
//以上就是邻接表存储树图深搜的一个基础模板