標題: “求解有n個人、m個任務,任務間有依賴關系的最小完成天數”
內容:
2022-04-01:給定有n個人和m個任務,任務之間存在依賴關系,記錄在int[][] depends中。
例如,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倉庫或鏈接。
參考鏈接:
百度分享代碼,如果開啟HTTPS請參考李洋個人博客
每一天,每一秒,你所做的決定都會改變你的人生!