Q-7-7. AOV 最早完工時間


Submit solution

分數: 100 (partial)
時間限制: 1.0s
記憶體限制: 1G

作者:
題目類型
允許的語言
Assembly, Brainfuck, C, C++, Python

某個計劃有 \(n\) 項工作,以 \(1 \sim n\) 編號,工作之間有前置關係。我們用一個點代表一項工作,以邊 \( (a, b) \) 表示 \(a\) 是 \(b\) 的前置工作,也就是說 \(a\) 完成之後,工作 \(b\) 才能開始。

每一項工作 \(v\) 有一個需求的工作時間 \(w[v]\),代表該工作至少需要耗時 \(w[v]\) 才能完成。

本題要計算此計畫的最早完工時間,也就是計畫開始後,最早可以完成所有工作的時間。此外,對於某個工作,如果該工作的任何延誤都會讓整個計畫的最早完工時間延後,這個工作就稱為關鍵工作,否則稱為非關鍵工作。

例子

假設 \(n = 3\),前置關係有 \((1, 3)\) 與 \((2, 3)\),代表:

  • 工作 \(1\) 完成後才可以開始工作 \(3\)。
  • 同樣地,工作 \(2\) 完成後才可以開始工作 \(3\)。

需求工時為:

\begin{aligned} w[1] &= 1 \ w[2] &= 3 \ w[3] &= 4 \end{aligned}

我們可以看得出:

  • 工作 \(1\) 與 \(2\) 可以平行作業。
  • 時間 \(1\) 時,工作 \(1\) 可以完成。
  • 時間 \(3\) 時,工作 \(2\) 可以完成。

因此,工作 \(3\) 最早可以在時間 \(3\) 開始,而最早的完工時間為:

\( 3 + 4 = 7\)

在這三項工作中:

  • 工作 \(2\) 與 \(3\) 是關鍵工作
  • 工作 \(1\) 不是關鍵工作,因為工作 \(1\) 只要不花超過 \(3\) 的工時(即延誤不超過 \(2\)),就不會影響整個計劃的最早完工時間。

輸入格式

第一行是兩個正整數 \( n \) 與 \( m \) ,代表工作數與前置關係數,點以 \( 1 \)  ~ \(n\)編號, 第二行是 \( n \) 個正整數,依序代表每一個工作的需求工時 \( w[v]\) ,接下來有 \( m \) 行,每行 兩個整數 \( u \) 與 \( v\) ,代表 \( u \) 是 \( v \) 的前置工作。 \(n\) 不超過 \(1e4,m\) 不超過 \(1e5,w\) 不超過 \(1e3\) 。輸入保證有解。

輸出格式

第一行輸出最早完工時間, 第二行輸出那些工作是關鍵工作,輸出時依照工作的編號由小到大,相鄰兩數字之間以一個空白分格。

範例輸入 1

3 2
1 3 4
1 3
2 3

範例輸出 1

7
2 3

範例輸入 2

4 4
1 2 3 4
1 2
1 3
1 4
3 4

範例輸出 2

8
1 3 4

評論

目前沒有評論。