树与图的存储和遍历
作者:
自由基
,
2021-08-12 14:09:57
,
所有人可见
,
阅读 540
有向图与无向图
有向图:a ——> b;
无向图:a —— b;
若为无向图,则建两条边:a -> b, b -> a;
(无向图是特殊的有向图)
树与图的存储
邻接矩阵 -> 二维数组
g[a][b] : 表示 a -> b 的一条边
邻接矩阵不能维护重边
邻接表:
int h[N], e[N], ne[N], idx;
void add(int a, int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx ++ ;
}
idx = 0;
memset(h, -1, sizeof h);
树与图的深度优先遍历
int dfs(int u) {
st[u] = true;
for (int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
if (!st[j]) dfs( j );
}
}
树与图的广度优先遍历
queue<int> q;
st[1] = true;
q.push(1);
while (q.size())
{
int t = q.front();
q.pop();
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if (!st[j])
{
st[j] = true;
d[x] = d[t] + 1;
q.push(j);
}
}
}