图论基础知识 深度优先(Depth First Search, 简称DFS),广度优先(Breathe First Search, 简称BFS)

图论基础知识

学习记录自代码随想录

dfs 与 bfs 区别

dfs是沿着一个方向去搜,不到黄河不回头,直到搜不下去了,再换方向(换方向的过程就涉及到了回溯)。
bfs是先把本节点所连接的所有节点遍历一遍,走到下一个节点的时候,再把连接节点的所有节点遍历一遍,搜索方向更像是广度,四面八方的搜索过程。

深度优先搜索理论(Depth First Search, 简称DFS)

搜索方向,是认准一个方向搜,直到碰壁之后再换方向
换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程。

回溯算法模板

// 1.确定返回值和参数
void backtracking(参数){
   
   
	// 2.确定回溯终止条件
	if(终止条件){
   
   
		// 存放结果;
		return;	
	}
	// for横向遍历
	for(选择:本层集合中元素(树种节点孩子的数量就是集合的大小)){
   
   
		处理节点;
		// 纵向遍历
		backtracking(路径,选择列表); // 递归
		回溯,撤销处理结果
	}
}

回溯算法模板,其实就是dfs框架

// 1.确定递归函数返回值和参数,一般无返回值
一般情况下深搜需要二维数组结构保存所有路径,需要一维数组保存单一路径,
可定义全局变量
vector<vector<int>> result; // 保存符合条件的所有路径
vector<int> path; // 起点到终点的路径
void dfs(参数){
   
   
	// 2.确定回溯终止条件
	if(终止条件){
   
   
		// 存放结果;
		return;	
	}
	// 3.处理目前节点出发的路径
	// for横向遍历
	for(选择:本节点所连接的其他节点){
   
   
		处理节点;
		// 纵向遍历
		dfs(图,选择的节点); // 递归
		回溯,撤销处理结果
	}
}

广度优先搜索(Breath First Search, 简称BFS)

一维bfs

例题
给定一个正整数数组,最大为100个成员,从第一个成员开始,走到数组最后一个成员最少的步骤数,
第一步必须从第一元素开始,1 <= 步长 < len / 2,第二步开始以所在成员的数字走相应的步数,
如果目标不可达返回 - 1,只输出最少的步骤数量

输入描述

由正整数组成的数组,以空格分隔,数组长度小于100,请自行解析数据数量。

输出描述

正整数,表示最少的步数,如果不存在输出 - 1

输入

7 5 9 4 2 6 8 3 5 4 3 9
输出

2

//给定一个正整数数组,最大为100个成员,从第一个成员开始,走到数组最后一个成员最少的步骤数,
//第一步必须从第一元素开始,1 <= 步长 < len / 2,第二步开始以所在成员的数字走相应的步数,
//如果目标不可达返回 - 1,只输出最少的步骤数量
//
//输入描述
//
//由正整数组成的数组,以空格分隔,数组长度小于100,请自行解析数据数量。
//
//输出描述
//
//正整数,表示最少的步数,如果不存在输出 - 1

//输入
//
//7 5 9 4 2 6 8 3 5 4 3 9
//输出
//
//2

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <sstream>
#include <queue>

using namespace std;

class Solution {
   
   
public:
    
    // 一维BFS
    struct Node {
   
   
        int pos;
        int step;
        Node(int p, int s) : pos(p), step(s) {
   
   }
    };
    int minOperationNum_BFS(vector<int>& nums) {
   
   
        int len = nums.size();
        queue<Node> q_num;
        vector<bool> visited(len, false);
        for (int i = 1; i < len / 2; i++) {
   
   
            q_num.push(Node(i, 1));
            visited[i] = true;
        }
        while 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值