树和图的存储与搜索
作者:
lhqwd
,
2021-02-22 18:14:56
,
所有人可见
,
阅读 482
存储
int h[M]; //每个结点都有一个头结点
int e[M]; //存储第i个点的value
int ne[M]; //存储第i个点的next
int idx; //序号
//初始化
void init()
{
memset(h, -1, sizeof h);
}
//插入一个有a到b的边
void add(int a, int b)
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx;
idx ++;
}
遍历(dfs)
int st[M]; //存储结点是否被访问过
void dfs(int u) //访问u结点
{
st[u] = 1; //标记为访问过
//开始访问u的所有子节点
for (int i = h[u]; i != -1; i = ne[i]){
int j = e[i]; //下一个节点的编号
if (!st[j])
dfs(j);
}
}
遍历(bfs)
void bfs()
{
queue<int> q;
st[1] = 1; //从一号点开始
q.push(1);
while (q.size()){
int u = q.front();
q.pop();
for (int i = h[u]; i != -1; i = ne[i]){
int j = e[i];
if (!st[j]){
st[j] = 1;
q.push(j);
}
}
}
}