Notas de algoritmo - Búsqueda primero en profundidad/amplitud
La búsqueda primero en profundidad y la búsqueda primero en amplitud se utilizan principalmente en el recorrido de gráficos. Tienen muchas plantillas. Personalmente, creo que son algoritmos relativamente simples. Las siguientes son las plantillas para la búsqueda profunda y la búsqueda amplia. Siga las plantillas para hacer más preguntas. puede dominar
búsqueda en profundidad
Proceso:
- acceder al vértice inicial especificado
- Si hay vértices adyacentes no visitados del vértice visitado actualmente, seleccione uno de los vértices para visitar y luego regrese al primer paso
- Si se han visitado todos los vértices adyacentes del vértice actual, devuelve el vértice anterior del vértice actual
Como se muestra en la figura a continuación, de hecho, es visitar el final a lo largo de un borde primero y luego volver a visitar el otro borde.
plantilla
DFS generalmente se implementa por recursividad
void dfs(int x){
if (满足退出条件){
退出处理
return;
}
for (;;){
//枚举当前顶点的下一个邻接顶点
if (顶点满足条件) {
处理顶点
dfs(顶点);//向下深入遍历
}
}
return ;//退出
}
Aquí, al enumerar el siguiente vértice adyacente, si está en el gráfico, solía definir primero un vector de dirección y luego lo usaba para enumerar el siguiente vértice.Tome
las cuatro direcciones de arriba, abajo, izquierda y derecha como ejemplo. :
Primero define:
int fx[4][2] = {
{
-1, 0}, {
0, 1}, {
1, 0}, {
0, -1}};
enumerar:
for (int i = 0; i < 4; i++)
{
dfs(x + fx[i][0], y + fx[i][1], board);
}
Búsqueda en amplitud
Proceso:
- acceder al vértice inicial especificado
- poner en cola todos los vértices adyacentes de un vértice
- Regrese al primer elemento de la primera cola de acceso y aparecerá el primer elemento de la cola.
Como se muestra en la figura a continuación, primero agregue los vértices adyacentes del vértice actual a la cola y luego acceda a los vértices adyacentes de la siguiente capa
plantilla
BFS generalmente se implementa a través de colas
queue<int> qu;//定义队列
qu.push(起始顶点);
while (!qu.empty())
{
auto front = qu.front();
qu.pop();
//获得首部顶点并将首部弹出
for (;;)//遍历当前顶点的所有邻接顶点并加入队列
{
if (邻接顶点符合题目要求)
{
qu.push(邻接顶点);
}
}
}
La plantilla anterior es solo el ejemplo más básico. Diferentes temas definitivamente serán diferentes. Debe realizar más modificaciones según la plantilla y el significado de la pregunta.