#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);//从第一个点开始搜索 }