2022-04-01:有n个人,m个任务,任务之间有依赖记录在int[][] dep

2022-04-01:有n个人,m个任务,任务之间有依赖记录在int[][] dep

逢婷茹 2024-11-21 百科资讯 703 次浏览 0个评论

2022-04-01:有n个人,m个任务,任务之间有依赖记录在int[][] dep

标题: “求解有n个人、m个任务,任务间有依赖关系的最小完成天数”

2022-04-01:有n个人,m个任务,任务之间有依赖记录在int[][] dep

内容

2022-04-01:给定有n个人和m个任务,任务之间存在依赖关系,记录在int[][] depends中。

2022-04-01:有n个人,m个任务,任务之间有依赖记录在int[][] dep

例如,depends[i] = [a, b]表示任务a依赖于任务b的完成。其中,0 <= a < m,0 <= b < m。

一个人一天可以完成一个任务,每个人都会选择当前可以做的任务中,编号最小的任务进行。

一个任务只有当它所有依赖的任务都完成后,才能开始。

我们需要计算n个人完成m个任务所需的天数。

解答

该问题的解决方案涉及拓扑排序和动态规划。我们首先将任务间的依赖关系转化为“下一个任务”的列表,并计算每个任务的入度。

接下来,我们使用一个工人队列和一个待执行任务队列,其中待执行任务队列中的任务按照编号进行排序。

每个工人会选择当前可以做的任务中编号最小的任务,然后增加完成该任务所需的工人的醒来时间。同时,更新依赖该任务的其他任务的开始时间,并更新入度为0的任务的待执行任务队列。

我们重复这个过程,直到所有任务都被完成。如果所有任务都被完成,则返回完成所有任务所需的最大天数。否则,返回-1表示无解。

以下是使用Golang编写的代码实现:

package main

import (
    "fmt"
    "sort"
)

func days(n, m int, depends [][]int) int {
    // ...
    // ... (代码实现)
    // ...

    return finishAll
}

func main() {
    depends := [][]int{{3, 0}, {4, 1}, {5, 2}, {4, 3}, {6, 5}, {7, 4}, {7, 6}}
    ret := days(3, 8, depends)
    fmt.Println(ret)
    ret = days(2, 8, depends)
    fmt.Println(ret)
}

结果展示

执行上述代码后,将输出完成所有任务所需的天数。

图片展示:

[图片链接]

请注意,由于我无法直接插入图片,您需要将上述代码中的“[图片链接]”替换为实际图片的URL或本地路径。

备注

如果您需要查看Java版本的解决方案,请查阅相关GitHub仓库或链接。

参考链接

转载请注明来自抚顺市中旅旧机动车交易市场,本文标题:《2022-04-01:有n个人,m个任务,任务之间有依赖记录在int[][] dep 》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!
Top