📜  字典序最小的拓扑排序(1)

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

字典序最小的拓扑排序

在图论中,拓扑排序是一种算法,它可以将有向无环图(DAG)中的所有节点排成一个线性序列,使得对于任意一对有向边 (u,v),都有节点 u 在序列中排在节点 v 的前面。拓扑排序可以用于检测有向图中是否有环,如果有环,则无法进行拓扑排序。同时,拓扑排序还可以用于对任务进行排序,以便确定任务执行的顺序。

本文介绍一种求解字典序最小的拓扑排序的方法。字典序最小的拓扑排序是指在所有符合拓扑排序条件的排序中,字典序最小的排序。具体来说,对于两个不同的拓扑排序 T1 和 T2,如果存在一个位置 i (1 ≤ i ≤ n),使得在 i 之前的所有位置排序相同,但是在位置 i 上 T1 中的节点要排在 T2 中的节点之前,则 T1 的字典序比 T2 小。

解题思路

为了求解字典序最小的拓扑排序,我们需要引入另外一个概念:拓扑序。对于有向无环图G=(V,E),拓扑序是对所有节点的一种全序关系(即任意两个节点之间都可以比较大小),使得如果 (u,v)∈E,则节点u的拓扑序小于节点v的拓扑序。

我们可以使用队列来实现拓扑排序。首先将入度为0的节点加入队列。然后每次从队列中取出一个节点 u,将 u 的所有邻接节点的入度减1。如果某个邻接节点的入度为0,则将其加入队列。这个过程中,如果队列中的节点数不足 n 个,则说明存在环,无法进行拓扑排序。

我们在实现拓扑排序的同时,还需要维护每个节点的拓扑序。设节点 u 的拓扑序为 f(u),则有 f(u) = max{f(v)+1|(v,u)∈E}。其中 max 表示最大值。由于节点的拓扑序需要依赖于其邻接节点的拓扑序,因此不能直接求解。但是我们可以借助字典序最小的排序影响最小的特征,使用堆来维护当前入度为0的节点中,拓扑序最小的节点。

具体来说,我们在将入度为0的节点加入队列的同时,将其拓扑序加入堆中。每次从队列中取出一个节点 u 后,将 u 的邻接节点的拓扑序更新为 max{f(v)+1|(v,u)∈E},更新后如果邻接节点的入度为0,则将其拓扑序加入堆中。这样,堆中的节点就是当前入度为0的节点中拓扑序最小的节点,我们将其加入结果数组中即可。

代码实现

下面是基于 Python 语言实现的代码:

from typing import List
import heapq

def topoSort(n: int, edges: List[List[int]]) -> List[int]:
    # 初始化入度数组和邻接表
    indegrees = [0] * n
    adj = [[] for _ in range(n)]
    for u, v in edges:
        indegrees[v] += 1
        adj[u].append(v)

    # 初始化堆和拓扑序数组
    pq = []
    for i in range(n):
        if indegrees[i] == 0:
            heapq.heappush(pq, i)

    f = [0] * n
    res = []

    # 拓扑排序
    for k in range(n):
        if not pq:
            return []
        u = heapq.heappop(pq)
        f[u] = k
        res.append(u)
        for v in adj[u]:
            indegrees[v] -= 1
            if indegrees[v] == 0:
                heapq.heappush(pq, v)
    return res

代码中第 3 行到第 8 行是初始化入度数组和邻接表,其中 indegrees[i] 表示节点 i 的入度,adj[i] 表示节点 i 的邻接节点。第 11 行到第 14 行是初始化堆和拓扑序数组,pq 是一个小根堆,存储当前入度为0的节点中拓扑序最小的节点。f[i] 表示节点 i 的拓扑序。第 17 行到第 26 行是拓扑排序的核心代码,首先从堆中取出一个节点 u,计算它的拓扑序 f[u],然后将其加入结果数组 res 中。接下来更新 u 的邻接节点 v 的拓扑序 f[v],将入度为0的邻接节点加入堆中,继续循环直到所有节点都被加入结果数组中,或者发现有环。

参考文献
  1. 《算法竞赛进阶指南》, 许丹阳等著, 人民邮电出版社, 2019.
  2. 《算法设计与分析》,王道论坛,2021.