📜  门| GATE-CS-2004 |第 85 题(1)

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

门 | GATE-CS-2004 |第 85 题

这道题目考查了程序员对图论的理解和应用。主要内容是根据提供的图形,构建程序来实现给定的要求。以下是一些需要了解的概念:

  • 图(Graph):由节点和边组成的抽象数据类型。
  • 有向图(Directed Graph):边有方向的图。
  • 无向图(Undirected Graph):边无方向的图。
  • 路径(Path):从一个节点到另一个节点的连续边组成的序列。
  • 单源最短路径(Single-Source Shortest Path):从一个起点到其他所有节点的最短路径。
  • Dijkstra 算法:解决单源最短路径问题的经典算法。

给定一个有向图,节点表示车站,边表示两个车站之间的直达路线,边权表示两个车站之间的距离,要求实现一个函数,根据起点和终点,输出从起点到终点的最短路径。

以下是 Python 实现代码:

from heapq import heappush, heappop

def dijkstra(adj, src, dst):
    dist = {v: float("inf") for v in adj}
    dist[src] = 0
    prev = {}

    pq = [(0, src)]

    while pq:
        u_dist, u = heappop(pq)

        if u == dst:
            path = []
            while u:
                path.append(u)
                u = prev.get(u)
            return path[::-1], u_dist

        if u_dist > dist[u]:
            continue

        for v, w in adj[u].items():
            alt = u_dist + w
            if alt < dist[v]:
                dist[v] = alt
                prev[v] = u
                heappush(pq, (alt, v))

    return None, None

其中 adj 是图的邻接表,src 是起点,dst 是终点。函数返回 (path, dist),其中 path 表示最短路径,dist 表示最短距离。

该算法的时间复杂度为 $O(E \log V)$,其中 $E$ 是边数,$V$ 是节点数。使用堆优化后,该算法的空间复杂度为 $O(V)$。