【Acwing】(三)搜索与图论

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  顺序可以颠倒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值