📅  最后修改于: 2023-12-03 15:12:44.220000             🧑  作者: Mango
本问题要求编写程序,利用 贪心算法 在一个有向无环图中确定每个节点的最长路径的长度。
def longest_path(n: int, edges: List[Tuple[int, int]]) -> List[int]:
pass
n
: 图中节点的数量,一个正整数。edges
: 表示有向图的所有边。每个元素是 $(u, v)$,表示从节点 $u$ 向节点 $v$ 连一条边。保证每对 $u, v$ 最多出现一次。n = 4
edges = [(0, 1), (0, 2), (1, 2), (2, 3)]
print(longest_path(n, edges))
输出
3
from typing import List, Tuple
def longest_path(n: int, edges: List[Tuple[int, int]]) -> List[int]:
graph = [[] for _ in range(n)]
in_degree = [0] * n # 计算每个节点的入度,in_degree[i] 表示节点 i 的入度
for u, v in edges:
graph[u].append(v)
in_degree[v] += 1
queue = [] # 保存入度为 0 的节点
for i in range(n):
if in_degree[i] == 0:
queue.append(i)
longest_paths = [0] * n # 保存每个节点的最长路径长度,初始化为 0
while queue:
u = queue.pop(0)
for v in graph[u]:
in_degree[v] -= 1
longest_paths[v] = max(longest_paths[v], longest_paths[u] + 1)
if in_degree[v] == 0:
queue.append(v)
return max(longest_paths)