📜  门| GATE-CS-2016(套装1)|第 51 题(1)

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

门| GATE-CS-2016(套装1)|第 51 题

这道编程题是 GATE-CS-2016 (套装1) 的第 51 题,要求求解一系列任务之间的依赖关系。本题需要采用图论中的有向无环图(DAG)来解决这种依赖关系问题。

问题描述

给定 $n$ 个任务($1\leq n\leq 10^3$),每个任务需要 $m_i$ 种资源来完成,其中第 $j$ 种资源需要 $a_{i,j}$ 个前置任务才能获取。其中,$1\leq m_i \leq 10$,$1\leq a_{i,j} \leq n-1$。

求解这个任务图,求出模块化部署所有资源的最短时间。

解题思路

本题需要通过建立依赖关系图,即有向无环图(DAG),来解决任务之间的依赖关系问题。任务之间的依赖关系可以抽象为一个图,其中节点表示任务,边表示任务之间的依赖关系。

对于每个任务,建立一个任务节点,在节点内部保存每个任务所需的资源信息(即 $m_i$ 和 $a_{i,j}$)。对于每个资源,也建立一个节点,同样记录它所依赖的其他任务。构建好任务图后,求解图中所有任务的拓扑排序,并根据拓扑排序结果依次处理各个任务,即可实现最短时间部署所有资源的问题。

代码实现

下面给出一个 Python3 的代码片段,实现了任务图的构建、拓扑排序及最短时间部署资源的求解。

from collections import defaultdict
def topoSort(graph, inDegree, timeTaken):
    queue = []
    for node in inDegree:
        if inDegree[node] == 0:
            queue.append(node)
            timeTaken[node] = 0
    while queue:
        node = queue.pop(0)
        for neighbor in graph[node]:
            inDegree[neighbor] -= 1
            timeTaken[neighbor] = max(timeTaken[neighbor], timeTaken[node]+1)
            if inDegree[neighbor] == 0:
                queue.append(neighbor)

def shortestTime(n, resources):
    graph = defaultdict(list)
    inDegree = {i: 0 for i in range(n)}
    timeTaken = {}
    for i in range(n):
        timeTaken[i] = -1
        for j in range(resources[i][0]):
            task = resources[i][1][j][0]-1
            graph[task].append(i)
            inDegree[i] += 1

    topoSort(graph, inDegree, timeTaken)

    if -1 in timeTaken.values():
        return -1
    return max(timeTaken.values())

该代码先构建了一个 defaultdict 数据结构,用于存储每个任务节点所依赖的资源节点列表。同时建立一个 inDegree 字典,用于记录每个节点的入度(即它所依赖的节点数量)。然后,采用基于队列的拓扑排序算法求解任务图中所有任务的拓扑排序,并根据拓扑排序结果依次处理各个任务,即可求解出最短时间部署所有资源的问题。

注: 代码中 graph 和 inDegree 的数据结构采用字典(Python 的 defaultdict),字典可以实现快速插入、查找和删除操作,非常适合追踪和管理大规模任务和资源的关系。