树与图的深度优先遍历*:
树其实也是图的一种
图: 分为有向图和无向图
图的储存:
第一种:邻接矩阵,就是一个二维数组,缺点:当点和边特别多的时候,存不下,一般用的比较少,而且非常浪费空间
第二种:邻接表:由n个单链表组成,也可以用vector动态数组来实现,但vector有很大的缺点,当点和边非常大时,用vector动态数组的方法很容易超时,所以我们常用n个但链表的方式来存储图
树与图的遍历模板:
const int N = 1e6 + 10;
int h[N], e[N], ne[N], idx, n;//这里跟单链表一样,只不过这里是N个头节点,H[N]
bool vis[N]; //判断是否遍历过
void add(int a, int b) //邻接表存树与图
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void dfs(int cur)
{
vis[cur] = true;
for(int i = h[cur]; i != -1; i = ne[i])
{
//遍历树
int u = e[i];
if(!vis[u])
{
dfs(u);
}
}
}
int main()
{
int a, b;
cin >> n;
//初始化
memset(h, -1, sizeof h);
memset(vis, false, sizeof vis);
for(int i = 0; i < n; i++)
{
cin >> a >> b;
//建树,双向图
add(a, b);
add(b, a);
}
dfs(1);
return 0;
}