邻接表遍历
作者:
保障睡眠质量
,
2024-05-16 12:41:29
,
所有人可见
,
阅读 5
#include<iostream>
#include<cstring>
using namespace std;
/*
依照树的重心的条件,数据范围是1 ≤n ≤ 1e5, 表示 a、b之间存在一条边
且题目中说是无向边,那么其实对于每一条边都需要加两次a到b的和b到a的
所以边的范围是还要乘2的
*/
const int N = 1e5 + 5, M = N * 2;
int h[N], e[M], ne[M], idx;
bool st[N]; //一般,不管是深度还是宽度,每个点只会遍历一次
void add(int a, int b){
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void dfs(int u){ //当前已经搜到了u这个点
st[u] = true; //首先标记一下,当前这个点已经被搜过了
//遍历一下 u 的所有出边
for(int i = h[u]; i != -1; i = ne[i]){
int j = e[i]; //j存的是当前这个链表里的节点对应的图里面的节点的编号
if(!st[j]){ //如果j没有被搜过,那我们就继续搜
dfs(j); //一条道走到黑
}
}
}
int main(){
memset(h, -1, sizeof h);
dfs(1);
return 0;
}