图论基础知识
学习记录自代码随想录
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