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

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

题目简介

本题是2021年Gate-CS的80题,考查了程序员对DAG(有向无环图)和拓扑排序的理解。

题目要求

给定一个有向无环图,请输出其中的一个拓扑排序,若图中存在环,则输出"cycle found"。

解题思路

对于一张有向无环图,其存在至少一种拓扑排序。因此,我们可以使用一种基于贪心的算法——选择入度为0的顶点进行拓扑排序。

具体实现:

  1. 统计每个顶点的入度。
  2. 将入度为0的顶点加入拓扑序列。
  3. 将所有以该顶点为起点的边删除,即将相邻顶点的入度减1。
  4. 重复执行步骤2-3,直到所有顶点均被加入拓扑序列或发现了环。

对于步骤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语言及其相关库的使用。