DFS
深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。
int check(参数) { if(满足条件) return 1; return 0; } void dfs(int step) { 判断边界 { 相应操作 } 尝试每一种可能 { 满足check条件 标记 继续下一步dfs(step+1) 恢复初始状态(回溯的时候要用到) } }
基本参数:
path [ i ] 路径点u 层数
st [ i ] 记录已经用过的点,定义成布尔类型
BFS
走迷宫问题:
g二维数组:其值记录图信息——————判断条件时候使用,是为了躲避障碍
pair型q 记录位置坐标 将位置坐标映射成搜索元素的顺序;即q[u]=(x,y) ,u可以认为是找到的第u个点,当然,越往后找找到的坐标越容易是出口, 队列就是在u上跑的;定义的时候一维数组即可[N*N]
d二维数组:其值表示距离
首先定义(0,0)位置,d=0;q=0;头尾节点指向0;定义四个方向,当现有坐标加上这四个方向的时候能满足在限制条件里面,d就在原有基础上加1;
队列;先入先出 首先给出起始位置,都指向0;
头节点hh;尾节点tt就可以理解成u,每一次尾节点搜到几个元素,头节点就要去移动,在新生成的几个扩展点上继续找
树与图的深度优先遍历
树与图的广度优先遍历
拓扑排序
朴素dijkstra(稠密图)
n:点数
m:边数
m和n^2一个级别 稠密图;稠密图用邻接矩阵存
m和n一个级别 稀疏图;稀疏图用邻接表存
主要思想
把一个图上的点分成两类,一类是最短路径树上所包含的点记作集合S,另一类当然就不是最短路径上的点记作集合V;怎么确定哪个点能够属于S呢?遍历图上的所有的点,找出距离起始点的路径最短的那个点,把他放入集合S中,然后在更新图上所有点离起始点的距离信息,就是比较经过刚刚放入S中的这个点和不经过这个点距离,选取最小的,然后再次遍历所有的点,重复上述步骤,直至所有的点都放入集合S中。
先找每一个没有确定点的最小值——确定该点——从而这个点的最短距离也就确定了——更新一下这个点相连的点到起点的距离——再从没有确定的点的里面找到最小值 ———确定该点——.......
如下图所示,注意在第二轮的时候,0-3距离为4,第三轮的时候,取4和3距离的最小值,更新最短距离,然后进入下一轮,确定该点
两重循环,时间复杂度为n^2;
堆优化:
遍历所有点的所有边就是遍历所有边
Bellman-Ford 算法
可以用来求负权回路
Folyd算法
并不是求1,n的最短,而是询问很多个
可以有负权边,但是不能有负权回路;
并不是所有的都需要画图去理解;
从整体理解思路,思路比模拟更重要一些;
必须先循环k,然后循环i,j 顺序可以颠倒