最短路20题心得

                                       最短路专题

最短路的三个算法:

  1. dij算法,时间复杂度最低O(nlogm),能够解决单源最短路径问题
  2. Floyd算法,时间复杂度最高O(n^3),能够解决多源最短路问题
  3. Spfa算法,时间复杂度O(kE),k在数据随机的时候只有2,最差的情况k=n

技巧:

  1. 将终点视为起点进行最短路
  2. 将u到v的边写成v到u的边(反边)(有时只将部分边变成反边)
  3. 最短路同样可以加新的点,拆点,建权值为0或inf的边来达到某些目的
  4. 有时需要考虑补图
  5. 将正权值的权值写成负的权值
  6. spfa可以判断正负环
  7. spfa中的num[]数组记录的是每个点的入队次数,当这个次数大于等于n的时候一定存在环的原因是:对于一个点它的入度最大是n-1,一个点每次一入队一定是因为其余的点的dis数组改变,而这些改变可以来自不同的点的改变,当一个点入队n次的时候那么一定有某个点让这个点重复入队了,而第二次入队也是因为这个点出队的时候松弛了某个点,而某个点正好还能松弛这个点,所以就形成了环。根据这些我们还可以把起始点的num[s]=n-1,因为起始点只要多入队一次一定是形成了环。
  8. Floyd可以通过给定权值为1来确定很多关系
  9. 等级划分的题可以加一个lim的数组来表示哪些点可以在最短路中松弛
  10. spfa可以被无限松弛的点不仅仅都在负环上,负环上有出边,这些出边连着的点也都是可以无限松弛的点
  11. 将一些矩阵问题或者是联通性问题转化为一些特殊的最短路来解决
  12. 最短路背景下边权全部为1的题不一定是最短路,因为有时最短路对于解决这种题的时间复杂度不够,这类题可以向bfs方向靠
  13. 有时用到1点和n点,不一定只算最短路,要考虑点1的最小环+点n的最小环看看哪种更优
  14. (不是特判的题,没有超级源点的题)用最短路来解决一些不等式问题,求1到n的最大差值,一般都是最大差值。
  15. 差分约束就是根据最短路松弛以后形成的图一定都满足dis[to]<=dis[u]+val来解决不等式问题的,所以不等式一定要是B-A<=常数的形式,这时候需要对A到B连一条权值为常数的边即可,对于单纯的>或<可以通过加减1来构造等号,两边乘-1来把>变<,对于B-A==C这种可以变成B-A<=C&&A-B<=C,还需要一个超级源点来使整个图全部连通,超级源点对所有点建一条权值为0的边这样只是将解都限制在小于等0的范围内,并不影响结果(特判题)
  16. 当最短路的题变难以后,最短路和网络流渐渐相似,灵魂也落在了建图上面,所以网络流中的一些建图技巧在最短路中也同样适用,类似加点,拆点,建权值为0或inf的边等等

坑点:

  1. 是否有自环和重边
  2. 双向边还是单向边
  3. 有无负边
  4. 是否是ll的数据
  5. 图是否是连通图
  6. 二维数组求最短路时一般初始化dis[i][i]=0;

Kuangbin专题19题

  1. 普通的dij,没有任何坑点
  2. 求最小生成树的最大边长
  3. 求最大生成树的最小边长
  4. dij从所有点到n的最短路,再从n到所有点的最短路中的最大值,将n设为起点跑一遍最短路,再将所有边反向跑一边最短路,对应的dis相加取最大值
  5. spfa判负环
  6. spfa判负环
  7. 求距离点1的最远的点的距离,dij然后扫一遍dis数组取最大值
  8. Floyd判断一头牛赢的次数+输的次数是否等于n-1
  9. spfa判正环
  10. 原图dij一遍,再将所有边取反dij一遍计算所有dis数组的和
  11. 类似spfa的那种不等式的题意,最终求1到n的最大差值,因为没有负边直接dij最短路就是最大差值
  12. dij火车和步行的建边,建好固定的火车的边,再对人和火车,火车和火车之间加步行的边
  13. dij有等级之分,所以要在包含酋长的m级之内进行交易,将可交易的物品的标记,只有标记去松弛边,剩下的就是按照题意建图了
  14. dij统计转弯次数,只需要将转弯的边的权值设为1,不转的权值设为0
  15. Spfa有负边的最短路,判断每个点的是无法到达,还是最短路可以无限松弛,还是有正常的最短路,无法到达的点dis=inf,可以无限松弛的点可以在spfa中当一个点入队n次时从这个点dfs搜可以连接到的所有点,因为经过这个地方无限的转圈最短路一定会变小,所以都是可以无限松弛的点(可以被无限松弛的点不仅仅都在负环上,负环上有出边,这些出边连着的点也都是可以无限松弛的点)
  16. dij通过对每一层加一个新的点从而达到两层之间任意点的距离是c,这时候要谨慎考虑哪些边要加正反边,哪些边加单向边,新的点要和当前层的点连单向边,当层的点和相邻层的新的点连单向边
  17. 求1到n不含公共边的最短路条数,对跑出最短路的边去建边权为1的图,对1到n跑最大流(最大流最小割定理)
  18. 明确题意,dij求一边1到n的最短路,min(dis[n],点1的最小环+点n的最小环),这类题可以是不连通的,所以要去求两个最小环来比较
  19. 差分约束spfa求1到n的最大差值,有负边

Hdu6252差分约束

标准的建立超级源点,用不等式来建边的板子题

你可能感兴趣的:(acm算法学习)