dfs 与 bfs 对于不同问题的的搜索方式
作者:
zhengyh
,
2020-03-05 11:10:03
,
所有人可见
,
阅读 989
对于图和树的搜索 利用链表存储形式来扩展头节点和向下延伸
// dfs
for(int i = h[u] ; i != -1 ; i = ne[i])
{
int j = e[i];
dfs(j);
}
// bfs
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;
}
}
}
对于一般问题以dir数组来扩展头节点和向下延伸或者根据具体问题进行搜索 eg.全排列..
dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
// dfs
for(int i = 0 ; i < 3 ; i ++ )
{
int tx = x + dir[i][0];
int ty = y + dir[i][1];
// 条件(出边, 标记, 可行)
dfs(tx, ty)
}
// bfs
for(int i = 0 ; i < 3 ; i ++ )
{
int tx = x + dir[i][0];
int ty = y + dir[i][1];
// 条件(出边, 标记, 可行)
q[++ tt] = {tx, ty};
}