📅  最后修改于: 2023-12-03 15:28:42.114000             🧑  作者: Mango
本题是2021年Gate-CS的80题,考查了程序员对DAG(有向无环图)和拓扑排序的理解。
给定一个有向无环图,请输出其中的一个拓扑排序,若图中存在环,则输出"cycle found"。
对于一张有向无环图,其存在至少一种拓扑排序。因此,我们可以使用一种基于贪心的算法——选择入度为0的顶点进行拓扑排序。
具体实现:
对于步骤4,我们可以通过queue(队列)实现。每次将入度为0的顶点加入队列末尾,处理完该节点后,将与该节点相关的顶点的入度减1,若相邻节点入度变为0,则加入队列。当队列为空时,若图中仍存在入度不为0的节点,则说明图中存在环,否则得到了拓扑序列。
以下是基于Python的代码实现:
def topological_sort(graph):
in_degree = {v: 0 for v in graph}
for v in graph:
for i in graph[v]:
in_degree[i] += 1
queue = [v for v in graph if in_degree[v] == 0]
result = []
while queue:
node = queue.pop(0)
result.append(node)
for i in graph[node]:
in_degree[i] -= 1
if in_degree[i] == 0:
queue.append(i)
if len(result) != len(graph):
return "cycle found"
else:
return result
本题是一个比较基础的拓扑排序问题,通过本题的练习,不仅能够加深对拓扑排序算法的理解,更能够让程序员更加熟练地掌握Python语言及其相关库的使用。