📜  门| GATE CS 2020 |问题 7(1)

📅  最后修改于: 2023-12-03 15:42:12.466000             🧑  作者: Mango

门 | GATE CS 2020 |问题 7

本题涉及离散数学中的图论定义和算法,需要对有向图、无向图、有向树和联通图有一定的了解。

题目描述

给定一个包含 $n$ 个节点和 $m$ 条边的有向图 $G=(V,E)$,其中 $V={1,2,\ldots,n}$,且对于每条边 $(u,v)\in E$,对应有一条非负整数的边权 $w(u,v)$。可以假设不存在从 $G$ 中任意一个节点到另一个节点的简单路径。

定义 $\Delta(u,v)\in{0,1,-1}$ 表示从节点 $u$ 到节点 $v$ 的方向,如果从 $u$ 到 $v$,则 $\Delta(u,v)=1$,如果从 $v$ 到 $u$,则 $\Delta(u,v)=-1$,如果 $u=v$,则 $\Delta(u,v)=0$。对于任意两个节点 $u$ 和 $v$,定义 $d(u,v)=\left\lceil \frac{w(u,v)-w(v,u)}{2} \right\rceil$。此外,如果 $u$ 和 $v$ 之间没有连通,则 $d(u,v)=+\infty$。

现在给定一个中间点 $c$,请你设计算法,计算从 $c$ 到其他节点的最短路径。对于所有节点 $v\in V$,输出 $\delta(c,v)+\sum\limits_{u\in V}\Delta(u,v)\cdot d(c,u)$ 的值,其中 $\delta(c,v)$ 表示从 $c$ 到 $v$ 的真实距离。

示例

输入:

4 4
1 2 2
1 3 1
3 2 3
3 4 4
3

输出:

0 -1 1 4
算法思路

本题涉及到了广义网络流的概念和 Spfa 离线优化方法。

首先,根据题意,我们可以将 $G$ 转化为一个带权无向图 $G'=(V',E')$,其中 $V'={1',2',\ldots,n'}\cup V$。对于任意两个节点 $i,j\in V$,如果 $(i,j)\in E$,则我们在 $G'$ 中添加一条从 $i'$ 到 $j'$ 的边,权值为 $d(i,j)-(d(i',j')+d(j',i'))$。

然后,我们将 $G'$ 中的所有节点 $i'\in V'$ 看作中间点,令 $c$ 为目标节点。对于 $i'\in V'$,我们定义 $\Delta(i',v')=1$,如果 $i'=v'$,则 $d(i',v')=0$,否则 $d(i',v')=+\infty$。对于 $v\in V$,我们定义 $\Delta(v',v)=-1$,$d(v',v)=-\sum\limits_{i'\in V'} d(i',v')$。

然后,我们可以定义 $\delta(i',j)+\sum\limits_{u\in V'}\Delta(u,j)\cdot d(i',u)$ 为从 $i'$ 经过 $j$ 到其他节点的路径长度,其中 $\delta(i',j)$ 表示从 $i'$ 到 $j$ 的真实距离。那么,对于每个节点 $j$,我们可以通过计算 $\delta(c,j)+\sum\limits_{i'\in V'}\Delta(i',j)\cdot d(c,i')$ 来求出从 $c$ 到 $j$ 的最短路径长度。

最后,我们使用 Spfa 算法来对每个节点 $j$ 进行求解。需要注意,由于我们需要中间点 $i'$ 按照经过 $j$ 的距离排序,因此我们需要使用离线 Spfa 算法来优化时间复杂度。

时间复杂度

转化为带权无向图后,遍历所有的节点和边只需要 $O(n+m)$ 的时间复杂度;而将其转化为广义网络流后,使用离线 Spfa 算法优化的结果是 $O(nm+n^3\log n)$。总时间复杂度为 $O(nm+n^3\log n)$。

空间复杂度

需要存储带权无向图 $G'$、节点和边的信息,以及离线 Spfa 算法需要的各个变量,总空间复杂度为 $O(n+m)$。