首页 > 其他分享 >图论 - 最短路随记

图论 - 最短路随记

时间:2024-01-14 10:24:43浏览次数:32  
标签:图论 一个点 短路 Floyd 集合 随记 dp dis

顺序有点乱,后续会排一下,然后分板块整理

All

  • 最短路算法的选择:

    \(n \le 100\) : Floyd(一般是较难的图论建模)

    \(n \le 4 \times 10 ^ 5\): dijkstra

    尽量不用 SPFA。

  • 神秘 IDEA: 一个带负权图,绝对最短路定义为,绝对值最小的最短路,求 \(s \to t\) 的绝对最短路。

  • 最短路中,任意一个点的前缀都是最短路

    具体的: \(u \to v\) 的最短路中有一个点 \(w\),那么 \(u \to w\) 的最短路,也在此条路径中。

Dijkstra

  • Dijkstra = 贪心 + DP
    时间复杂度: \(\text{O}(m \log m)\)

  • 证: 在 Dijkstra 算法过程中,每次找出 \(dis\) 最小的没有被确定最短路的点,它的 dis 一定是源点到它的最短路。

    注意:正难则反 \(\to\) 反证法

    证明: 设 \(S\) 集合表示最短路已经确定的点, \(T\) 集合表示最短路还没有确定的点。

    即证: \(T\) 集合中 \(dis\) 最小的元素可以直接加入到 \(S\) 集合中。

    所以 \(dis\) 中储存的数值, 为从源点到 \(u\),只经过 \(S\) 集合中的点所得到的最短路。

    反证:

    设当前 \(T\) 集合中 \(dis\) 最小的元素为 \(u\),且 \(dis_{u}\) 不为源点到 \(u\) 的最短路。

    如果有一条更短的最短路, 那么,这两条路径中至少要有一个点不同

    设最早不同的点为,\(v_1\) 和 \(v_2\),\(v_2\) 为更短最短路中的一个点, \(v_1\) 为当前路径中的一个点。

    当且仅当,\(v_2\) 在 \(T\) 集合中,才会没有被更新到。

    又因为,dijkstra 只能处理非负权图。(这里也可以说明为什么 dijkstra 只能处理非负权图

    所以, \(dis_{v_2}\) 只能小于 \(dis_u\) 才能更新到 \(u\)。(如果有负权,这里会出问题)

    发现,这与 \(dis_u\) 为 \(T\) 集合中最小的元素矛盾

    所以,不存在 \(v_2\)。

    得证

  • 有的时候,dijkstra 堆优化是负优化。

    Eg. \(m = n ^ 2\)

    时间复杂度为: \(O(n^2 \log n^2)\),不如暴力的 \(O(n ^ 2)\)。

Bellman Ford

  • Bellman Ford(可优化为容易被卡的 SPFA)

    优点: 可以处理负权,简单

    缺点:

    时间复杂度: \(\text{O}(nm)\)

Floyd

  • 有关 Floyd 的题目主要需要考虑 Floyd 中能提供的信息,而不能只看到 Floyd 提供的任意两点之间的最短路或者是传递闭包。 (TODO: Floyd 深度理解 【坑 ++】)

  • Floyd 跑3遍,任意循环顺序都可以求出全源最短路。

  • 证明: Floyd 的 \(k, i, j\) 枚举顺序为什么可行?

    回归 Floyd 的本初,原本为 DP,状态为 \(dp[k][i][j]\) :仅前 \(k\) 个点, \(i \to j\) 的最短路。

    \[dp[k][i][j] = \min(dp[k][i][j], dp[k - 1][i][k] + dp[k - 1][k][j]) \]

    此时,显然可行。

    怎么滚动掉第一维的?

    在 DP 的角度上看,这样的滚动是会使用到更新过的值,而非使用上一轮的数据。

    但是,这里 \(dp_{k, i, k}\) 由于其中不经过 \(k\),所以等价于 \(dp_{k - 1,i,k}\),覆盖了也没关系,所以只要原先状态与覆盖状态意义相同,则同样可以使用滚动数组。

  • Floyd 的中间过程,也有一定意义。

  • Q: Floyd 可以用来判断负环吗?

    A: 可以,跑两次 Floyd,在负环上的点则 \(dis\) 一直在减少。

建图思路

  1. 拆点

Eg. Paired Payment

如果这里没有权值为 $(w_{a,b} +w_{b,c})^2 $ 的限制的话, 那么就可以把一个点拆成两个点(也就是两层图),然后对于每一条边也拆成两条边:\(e(u_1, v_2), e(u_2, v_1)\) 那么这样就保证了走到 \(1\) 层一定会经过两条边,所以最后答案取该层即可。对于一定要走 \(k\) 条边也可以这样处理。

但是这里有这个平方的限制。

再看一眼数据范围 \(w \le 50\),所以可以根据这个建边了。

第 \(0\) 层为原图(不连边), \(1 \to k\) 层表示走到这个点经过的上一条边的边权为 \(k\),然后对于 \(u\) 以及它连接的点 \(v\) 建立 \(e({(u, 0), (v, w)}, 0)\) 然后再对于 \(u\),枚举所有边权,建立 \(e((u, i), (v, 0), (i * w_{u, v}) ^ 2)\),跑最短路即可。最后答案即为走到 \(s,0\) 时的权值。

Eg. 传送卷轴

这里需要处理一下传送。显然,直接连边不太现实,边数过于大了。

考虑传送的限制 \(abs(dis_x - dis_y) = k\)。

发现这里暴力连接的所有边是有重复部分的,所有同一深度的点都会指向 \(dis_i + k\) 和 \(dis_i - k\) 的所有点,考虑将重复部分不再反复建边,这时候建立 \(n\) 个中转点 \(dis_i + n\),每次先走到 \(dis_{i \pm k}\) 这个点,然后通过这个点走到这一深度的所有点,所以只需要连接 \(u, dis_{u \pm k} +n\) 和 \(dis_i\) 到这一深度的所有点即可。

形如:

标签:图论,一个点,短路,Floyd,集合,随记,dp,dis
From: https://www.cnblogs.com/Ice-lift/p/17963399

相关文章

  • 图论总结——最短路
    https://csacademy.com/app/graph_editor/https://riverhamster.gitee.io/app/graph_editor/注:时间复杂度分析中,假设\(n\lem\len^2\)。最短路本质上是一种DP。阶段:点状态:拆点决策:边最优子结构:最短路的任何子路径都一定是最短路。无后效性:正权图中一定可以找到一......
  • 【SPFA】最短路的一种算法
    SPFA算法是在bellman-ford算法基础上优化而来,所以我们先讨论bellman-ford算法bellman-ford算法的核心是‘松弛’。那么什么是松弛呢?以下图为例:假设数组d[i]表示源点s到达结点i的最短路径长度,那么松弛指的就是当d[a]+w<d[b],也就是说,这时候通过a到达b比原来的路径更......
  • 图论(2)
    目录130417130和昨天的飞地类似,都是从最边缘的位置进行dfs/bfs,然后判断哪个点没有被遍历过classSolution{public:intdir[4][2]={1,0,-1,0,0,1,0,-1};voiddfs(vector<vector<char>>&board,vector<vector<bool>>&visited,intx,inty){for(in......
  • 图论
    目录深搜入门leetcode797广搜入门leetcode200深搜和广搜6951020深搜入门leetcode797因为也是二刷,推的比较快刷题之后的感悟,其实就是先把模板写上去了之后再在里面缝缝补补出题目要求都比较模板,变通一下思路就能做出来classSolution{public:vector<vector<int>>resu......
  • P4021 [CTSC2012] 最短路
    [CTSC2012]最短路LuoguP4021题目描述给定一个节点\(1\)和节点\(n\)连通的正权无向图\(G\),请你删除不超过\(k\)条边,使得节点\(1\)和节点\(n\)仍然连通的同时,且这两点之间的最短路尽可能长。提交答案题。Solution模拟赛考到这道,改完这道题我爆了。提交答案题一......
  • Bellman-Ford算法实现带有负权边的单源最短路
    Bellman-Ford算法对于Dijkstra算法,不妨给出这样一个例子graphLRA((A))-->|1|C((C))A-->|2|D((D))D-->|-4|C根据Dijkstra算法的流程,选取A为源点。更新与A邻接的顶点,有C和D。选取已更新顶点中距离A的最小值,显然选择边权为1的边所连接的顶点C,并将C收入最短路集合S中,此......
  • 【图论】最大势算法
    模板题FishingNet给定一个无向图,判断是否是弦图。\(1\leqn\leq1000\)。算法概述最大势算法(MCS),是一个用于求出无向图完美消除序列的算法。算法流程为:钦定一个集合\(S\)。每次找到任意一个与\(S\)中的点连边最多的点,加入\(S\),放在消除序列末尾。这样就可以......
  • 图论1
    A.能量树时间限制:1000ms空间限制:262144kB题目描述时间:1s空间:256M题目描述:小信有 n 个节点的有根能量树,根为 1。最开始,树上每个节点的能量都是 0。现在小信有 n 个能量球,第 i 个能量球拥有 vi​ 能量。她想把这 n 个能量球分别放置在能量树......
  • G. Bicycles 分层图单源最短路
    题目链接简单描述一下题意:给定n个点,m条带权无向边,每个点i有一辆速度系数为Si的自行车。每经过一个点即可拥有该点的自行车,在任意两点之间路过的消耗为:已经拥有的某辆自行车的速度Si*边权Wi,求从1号点到n号点的最小消耗。思路:因为需要求的是最小的总消耗,所以在某个点出发时,我......
  • 图论
    相关定义图是一个二元组\((V,E)\),节点集合为\(V\),边集合为\(E\),其中边\((u,v)\)的顶点为\(u,v\)。其中顶点的度数为以该顶点为端点的边数。有向图:每条边存在一个方向\(u\)->\(v\),对于有向图,点\(u\)的出度为从\(u\)出发的边数,入度为到\(u\)的边数。无向图:每条......