算法基础课—搜索与图论(二) 树与图的存储方式、及其深度优先搜索与广度优先搜索、拓扑排序
树和图的存储方式
树——无环联通图
图——有向图、无向图
邻接矩阵——二维矩阵、邻接表(常用)——每个节点开一个单链表(有点类似hash里的拉链表)
邻接表
类似于拉链法
代码模板
// 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点
int h[N], e[N], ne[N], idx;
// 添加一条边a->b
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; // st[u] 表示点u已经被遍历过
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; // 表示1号点已经被遍历过
q.push(1);
while (q.size())
{
int t = q.front();
q.pop();
for (int i = h