树与图的遍历

it2022-06-27  82

树与图的深度优先遍历*: 树其实也是图的一种图: 分为有向图和无向图图的储存:

第一种:邻接矩阵,就是一个二维数组,缺点:当点和边特别多的时候,存不下,一般用的比较少,而且非常浪费空间 第二种:邻接表:由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; }

 


最新回复(0)