📜  门| GATE-CS-2016(Set 1)|问题4(1)

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

题目介绍

Gate-CS-2016(Set 1)的问题4是一道计算机科学相关的题目,涉及到图论和算法分析。该题目要求求出DAG(有向无环图)上从指定节点到其它所有节点的最短路径,并返回路径和长度。

实现思路

输入格式解析

题目要求输入的第一行是整数n和m,分别表示DAG中节点和边的数量。接下来m行描述图的边,每行三个整数u、v和w,表示一条从u到v权重为w的有向边。最后一行包含一个整数s,表示要寻找从该节点到其它所有节点的最短路径。

在程序中,可以用一个字典结构来存储图中的边。字典的键为起点u,值为一个列表,列表中每个元素是三元组(v, w),表示从u到v的有向边权重为w。

实现算法

由于DAG中不存在环路,因此可以采用拓扑排序(topological sort)来确定节点的处理顺序。定义d[v]表示从s到v的最短距离,d[s]=0,其他节点的d值初始化为无穷大。遍历DAG时,按照拓扑排序确定节点的处理顺序,对于每个节点u,遍历所有以u为起点的边,更新目标节点的最短距离。算法的时间复杂度为O(m+n),其中m为图中的边数,n为节点数。

最后,可以通过依次输出每个节点的最短路径和距离来展示结果。

代码实现

输入格式代码
n, m = map(int, input().strip().split())
graph = {i: [] for i in range(1, n + 1)}
for _ in range(m):
    u, v, w = map(int, input().strip().split())
    graph[u].append((v, w))
s = int(input().strip())
实现算法代码
import heapq

top_order = []
indegree = [0] * (n + 1)
heap = []
heapq.heappush(heap, (0, s))
d = [float('inf') for _ in range(n + 1)]
d[s] = 0

for u in range(1, n + 1):
    for v, w in graph[u]:
        indegree[v] += 1
for i in range(1, n + 1):
    if indegree[i] == 0:
        heapq.heappush(heap, (0, i))

while heap:
    p, u = heapq.heappop(heap)
    top_order.append(u)
    for v, w in graph[u]:
        indegree[v] -= 1
        if indegree[v] == 0:
            heapq.heappush(heap, (w, v))
        if d[v] > d[u] + w:
            d[v] = d[u] + w

## 结果输出

for u in top_order:
    print(u, d[u])

结语

本题通过介绍DAG的最短路径算法,展示了在计算机科学领域中的应用。拓扑排序算法不仅在DAG上求解最短路径问题中有着广泛的应用,也常见于算法设计和分析中。