📜  门| GATE-CS-2005 |第 74 题(1)

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

门| GATE-CS-2005 |第 74 题

本文将介绍 GATE-CS-2005 中的第 74 题,该题目涉及到有向图的遍历以及拓扑排序。

题目描述

给定一张 $n$ 个顶点的有向图 $G$,顶点从 $0$ 到 $n-1$ 编号,同时给定一个初始顶点 $s$ 和一个终止顶点 $t$,求从 $s$ 到 $t$ 的所有简单路径中的最长路径长度。

输入格式

第一行包含一个整数 $n$,表示有向图 $G$ 的顶点个数。接下来 $n$ 行,每行包含 $n$ 个整数,其中第 $i$ 行第 $j$ 个整数表示从顶点 $i$ 到顶点 $j$ 的边的长度。若从顶点 $i$ 到顶点 $j$ 不存在边,则为 $-1$。最后一行包含两个整数 $s$ 和 $t$,表示初始顶点和终止顶点。

输出格式

输出一个整数,表示从 $s$ 到 $t$ 的所有简单路径中的最长路径长度。如果不存在从 $s$ 到 $t$ 的路径,输出 $-1$。

算法分析
遍历所有简单路径

可以使用深度优先搜索(DFS)遍历图 $G$ 中所有从 $s$ 到 $t$ 的简单路径,对于每个遍历到的简单路径,记录其长度并和已经记录的最长路径长度进行比较。

单源最长路径

使用拓扑排序和动态规划的方法求解单源最长路径问题。具体来说,先对图进行拓扑排序,然后按照拓扑排序的顺序依次更新每个顶点的最长路径长度。

代码实现
遍历所有简单路径
def dfs(s, t, G, visited, path, max_len):
    """
    搜索 s 到 t 的所有简单路径,更新最长路径长度。
    """
    if s == t:
        max_len = max(max_len, sum(path))
        return max_len

    for i in range(len(G)):
        if visited[i] or G[s][i] == -1:
            continue
        visited[i] = True
        path.append(G[s][i])
        max_len = dfs(i, t, G, visited, path, max_len)
        path.pop()
        visited[i] = False

    return max_len
单源最长路径
import collections

def topo_sort(G):
    # 统计每个顶点的入度
    in_degree = [0] * len(G)
    for i in range(len(G)):
        for j in range(len(G)):
            if G[i][j] != -1:
                in_degree[j] += 1

    # 拓扑排序(BFS)
    queue = collections.deque([i for i in range(len(G)) if in_degree[i] == 0])
    while queue:
        u = queue.popleft()
        for v in range(len(G)):
            if G[u][v] != -1:
                in_degree[v] -= 1
                if in_degree[v] == 0:
                    queue.append(v)
        yield u

def longest_path(s, t, G):
    # 拓扑排序
    order = list(topo_sort(G))
    if s not in order or t not in order:
        return -1

    # 初始化
    dist = [-1] * len(G)
    dist[s] = 0

    # 动态规划
    for u in order:
        for v in range(len(G)):
            if G[u][v] != -1:
                dist[v] = max(dist[v], dist[u] + G[u][v])

    return dist[t]
总结

本文介绍了 GATE-CS-2005 中的第 74 题,涉及到有向图的遍历以及拓扑排序。对于遍历所有简单路径的方法,可以使用深度优先搜索(DFS);对于求解单源最长路径问题,可以使用拓扑排序和动态规划的方法。