📜  门| GATE-CS-2006 |问题 5(1)

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

问题5

此问题是关于图中进行最短路径查找的算法。

给定一个加权无向图 $G$,边权重为正整数。设 $n$ 为 $G$ 中的节点数,$m$ 为 $G$ 中的边数。

以下是一些相应的定义。

  • 边的长度是边上权重的和。一条路的长度是路上边的长度之和。
  • 设 $A$ 是 $G$ 的一个节点。$BFS(A)$ 是广度优先搜索,表示从 $A$ 开始,先访问点 $A$,然后访问所有离 $A$ 距离为 $1$ 的节点,然后访问所有距离为2的节点……依此类推。设 $BFS(A)$ 遇到第一次到达一个节点,就把这个节点的距离设为到达它的路径长度,以后不再更新。然后我们得到了许多节点,对于在 $BFS(A)$ 中的节点 $X$,我们称 $A$ 是 $G$ 中 $X$ 的父节点。因此树的根是 $A$,树中的每条边都与它在图中的一条边一一对应。
  • $D(A,B)$ 表示从 $A$ 到 $B$ 的所有路径中长度最短的路径的长度。一些节点对之间可能没有路径相连,此时 $D(A,B)=\infty$。

现在考虑利用 $BFS$ 查找 $G$ 中的最短路径。假设我们要计算从 $s$ (起点) 到所有节点 $t$ 的最短路径,并且我们已经计算了从 $s$ 到 $t$ 的最短路径,我们想要求出从 $s$ 到 $t'$ (新的节点) 的最短路径时,应该如何计算。

算法分析

算法1 - $BFS$

我们可以使用 $BFS$ 算法来解决本问题,具体算法步骤如下:

  1. 初始化所有节点的距离 $dis$ 为无穷大,$dis[s]=0$;
  2. 将 $s$ 加入队列 $Q$,开始进行 $BFS$;
  3. 对于队列中的每个节点 $u$,遍历所有与其相邻的节点 $v$,如果 $dis[v]>dis[u]+w(u,v)$,则更新 $dis[v]=dis[u]+w(u,v)$;
  4. 将 $v$ 加入队列 $Q$。

时间复杂度为 $O((n+m)\log n)$。

算法2 - $Dijkstra$

我们也可以使用 $Dijkstra$ 算法来解决本问题,具体算法步骤如下:

  1. 初始化所有节点的距离 $dis$ 为无穷大,$dis[s]=0$;
  2. 将 $s$ 加入优先队列 $PQ$,开始进行 $Dijkstra$;
  3. 取出 $PQ$ 中最小的 $dis$ 值对应的节点 $u$,遍历所有与其相邻的节点 $v$,如果 $dis[v]>dis[u]+w(u,v)$,则更新 $dis[v]=dis[u]+w(u,v)$;
  4. 将 $v$ 加入优先队列 $PQ$。

时间复杂度为 $O((n+m)\log n)$。

总结

本文介绍了如何利用 $BFS$ 和 $Dijkstra$ 算法找到加权无向图中的最短路径。熟练掌握这两种算法对于理解图论及其应用非常重要。