树与图的存储与遍历
树图的存储与遍历
树是特殊的图,是无环连通图,所以只需要看图的存储
图分为两种:有向图和无向图
无向图可以看为有向图,把所有无向边都存两个有向边即可
有向图的存储:
-
邻接矩阵,g[a][b]存储a->b n^2,适合存储稠密图
-
邻接表(n个单链表)(推荐)
使用邻接表存储

树与图的dfs和bfs与搜索算法相似
树的dfs代码实现:
#include <iostream>
using namespace std;
const int N = 100010, M = N * 2; // 因为是双向连通图
int n, m;
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;
idx ++ ;
}
void dfs(int u)
{
st[u] = true;
for (int i = h[u]; i != -1; i = ne[i])
{
if (!st[e[i]]) dfs(e[i]);
}
}
int main()
{
memset (h, -1, sizeof h);
return 0;
}
树与图的bfs代码实现:
void bfs()
{
// bfs之前要memset(h, -1, sizeof h);
memset(d, -1, sizeof d);
q[0] = 1;
d[1] = 0;
int hh = 0, tt = 0; // 用队列来存当前可以往后遍历的点
while (hh <= tt)
{
int t = q[hh ++ ];
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if (d[j] == -1)
{
d[j] = d[t] + 1;
q[ ++ tt] = j;
}
}
}
}

浙公网安备 33010602011771号