#include<iostream>
using namespace std;
int N = 1e5 + 10,M = N*2;
//h表示链表头,e存储的是所有的边,ne表示所有的next指针是多少,相当与n个单链表
int h[N],e[M],ne[M],idx;
//深度优先搜索和宽度优先搜索每个点只会遍历一次
bool st[N];//存一下那些点已经被遍历过了,就不要再遍历他了
void add(int a,int b){//a前插入b
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
//树和图的深度优先搜索的代码 时间复杂度是O(n + m),因为点数和边数呈线性关系
//u表示已经遍历到这个节点了
int dfs(int u){
st[u] = true;//首先先标记下当前这个点已经被搜索过了
//遍历下u的所有的初边
for(int i = h[u];i != -1;i = ne[i]){
// 存储当前结点对应图里边结点的编号是多少
int j = e[i];
//如果当前点没有做过的话,就一直搜,一条路走到黑
if(!st[j]) dfs(j);
}
}
int main(){
//头结点指向-1,n给单链表的头结点指向-1
memset(h,-1,sizeof h);
dfs(1);//从第一个点开始搜索
}