背包问题加深 二维:f[0][j] 初始化为1,其余为0,并且要保证背包剩余体积不为负数。二维:f[0][0] 初始化为1,其余为0,并且要保证背包剩余体积不为负数。一维:f[0] 初始化为1,其余为0,并且要保证背包剩余体积不为负数。二维:f[0][0] 初始化为1,其余为0,背包剩余体积可以为负数。一维:f[0] 初始化为1,其余为0,背包剩余体积可以为负数。一维最小值:f[0] 初始化为0,其余为INF。二维最小值:f[0][0] 初始化为0,其余为INF。二维最小值:f[0][0] 初始化为0,其余为INF。
搜索算法加深 (2)对于前缀数组的更新,是覆盖式的,所以对于最短路,每次更新时如果该点已经被搜过(即前缀数组有值),就不要再更新了,因为那不是最短路、(1)题目有时要求输出方案和路径的序列,所以就要用一个前缀数组把序列存起来。在bfs时,对于每一个点,每次都会扩展这个点的。方案,所以不需要再重新来一遍,所以也需要判重数组。,需要恢复现场,所以只能用dfs;(3)在dfs时,在回溯之前,每次搜的都是。,就不用恢复现场,用dfs和bfs都可以。(4)对于bool类型的dfs,,而是继续搜索其他方案。(1)bfs更新时,
拓扑排序加深 (3)拓扑排序的特点有一个是 “入度为0” 的点,在这里可能会涉及到一些别的操作,主要看题目的情景。(2)拓扑排序有时能用floyd和传递闭包代替,但是。,而传递闭包只能判断连通性和对应关系是否存在。(1)拓扑排序必须是有向图,而且它的。(4)拓扑排序和其他一些树和图一样,
Floyd加深 (1)对于 i,j 两点,如果能形成通路,那么就在两点间连一条边,通常在。(也可以说成 d[i][j] 和 d[j][i] 两个都。,然后还要求两点之间的最大值,这时候不是求最长路,而是求。(3)对于传递闭包的关系判断,如果。(2)floyd判断连通块通常是在。有通路),那么就说明有矛盾;(1)floyd通过判断。,那么就说明关系不确定。,那么关系就是唯一确。(4)传递闭包必须是。
单源最短路加深 求最大值边权必须小于0;求最小值边权必须大于0;求最大乘积边权必须小于1;求最小乘积边权必须大于1。(4)单源最短路求的是起点到其他任意一点的最短路,所以单源最短路也可以求。(5)单源最短路也可以做的很像最小生成树,求。无论是正的负的,还是加的乘的,(6)单源最短路可以是。(最基础的单源最短路)(起点与其他所有点)(起点与其他所有点)
图论最短路杂项 Dijkstra只能用于求解正边权的最短路,其时间复杂度只与点数有关;堆优化的Dijkstra,其时间复杂度既与点数有关,也与边数有关;,用邻接表存图的话不用做特殊处理,但是用邻接矩阵存图的话,就要取最小值。(4)如果有负权回路,并不说明在求解最短路的过程中一定会死循环,只是说。bellman-ford用于求解有负权边的最短路问题,并且可以规定。spfa也是用于求解有负权边的最短路问题,其实质上是。问题,它既可以处理正权边,也可以处理负权边,但是。(3)bellman-ford算法:复杂度。
Floyd算法 (1)floyd算法是基于动态规划思想的一种最短路算法(2)floyd用于处理多源汇最短路问题,也可以处理单源最短路,但是因为其时间复杂度较高,所以单源最短路一般还是选用其他算法(3)floyd不能处理有负权回路的最短路问题。
spfa算法 (1)spfa实质上是用队列优化的bellman-ford算法,在bellman-ford中,我们每一轮的松弛操作都需要遍历所有的边,但是有些边是不需要遍历的,所以我们把需要更新的边的起点放入队列中,更新队列里面存在的就行了(2)虽然bellman-ford也可以判断负环,但是一般用spfa。
Bellman-ford算法 (1)bellman-ford算法用于求解有负权边的最短路问题(2)bellman-ford可以用于判断有无负权回路(3)bellman-ford可以用于求解最多经过k条边的最短路问题。
拓扑排序基础 所以可以通过这点来判断一张图有没有环(即有没有拓扑序)(2)若队列不为空,每次取出队首数据,存放到一个数组中。(1)每张图的拓扑序列可能不唯一(每个时刻。(2)既可以用邻接表,也可以用邻接矩阵。,来判断是否有拓扑序。
迪杰斯特拉(Dijkstra)算法 (1)Dijkstra算法用于求解最短路问题,且所有的边权都必须为正(2)Dijkstra算法有朴素版本和堆优化版本两种;一般来说,如果是稠密图,就用朴素的,如果是稀疏图,就用堆优化的(3)稠密图或者点数比较少时一般用邻接矩阵,稀疏图或者点数比较多时一般用邻接表(邻接矩阵在有重边时要取最小值,邻接表则不用考虑重边)