PTA最短工期 拓撲排序

2021-10-02 17:16:17 字數 1741 閱讀 4925

乙個專案由若干個任務組成,任務之間有先後依賴順序。專案經理需要設定一系列里程碑,在每個里程碑節點處檢查任務的完成情況,並啟動後續的任務。現給定乙個專案中各個任務之間的關係,請你計算出這個專案的最早完工時間。

首先第一行給出兩個正整數:專案里程碑的數量 n(≤100)和任務總數 m。這裡的里程碑從 0 到 n−1 編號。隨後 m 行,每行給出一項任務的描述,格式為「任務起始里程碑 任務結束里程碑 工作時長」,三個數字均為非負整數,以空格分隔。

如果整個專案的安排是合理可行的,在一行中輸出最早完工時間;否則輸出"impossible"。

9 12

0 1 6

0 2 4

0 3 5

1 4 1

2 4 1

3 5 2

5 4 0

4 6 9

4 7 7

5 7 4

6 8 2

7 8 4

4 5

0 1 1

0 2 2

2 1 3

1 3 4

3 2 5

impossible

使用鄰接矩陣構造有向無環圖,進行拓撲排序,若最後進隊的結點不為結點總數,則說明未排序成功,或者有迴路…

捎帶複習了一下關鍵路徑,最早發生時間,最晚發生時間的概念。

整個活動的完成時間是aoe圖中從始點到終點的最長路徑的長度,這條路徑稱為關鍵路徑。關鍵路徑上的活動稱作關鍵活動

關鍵路徑不一定只有一條。

最早發生時間:從前往後,前驅結點到當前結點所需時間,取最大值。

最遲發生時間:從後往前,後繼結點的最遲發生時間-邊權值,取最小值。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

#define n 109

int mod =

1e9+

7,n,m;

#define m 249997

int vis[n]

;int edge[n]

[n];

int degree[n]

,time1[n]

;int

main()

for(

int i=

0;iwhile

(qu.

size()

) time1[i]

=max

(time1[i]

,time1[e]

+edge[e]

[i]);}

}}// cout << cnt << endl;

if(cnt!=n) cout <<

"impossible"

<< endl;

else

return0;

}

(拓撲排序)最短工期 25分

只適用於有向無環圖 有向無環圖一定有拓撲排序 把入度為0的點存放在佇列裡面 刪除該頂點連線的所有邊 解題步驟 記錄每個點的入度大小 把入度為0的點放入佇列中去 用乙個dist陣列存放路徑的大小,用cnt記錄頂點個數 刪除該頂點連線的所有邊,即每條邊對應的點的入度 1 再次把入度為0的點存放在佇列裡面...

最短工期 25分

乙個專案由若干個任務組成,任務之間有先後依賴順序。專案經理需要設定一系列里程碑,在每個里程碑節點處檢查任務的完成情況,並啟動後續的任務。現給定乙個專案中各個任務之間的關係,請你計算出這個專案的最早完工時間。輸入格式 首先第一行給出兩個正整數 專案里程碑的數量 n 100 和任務總數 m。這裡的里程碑...

7 1 最短工期 25 分

乙個專案由若干個任務組成,任務之間有先後依賴順序。專案經理需要設定一系列里程碑,在每個里程碑節點處檢查任務的完成情況,並啟動後續的任務。現給定乙個專案中各個任務之間的關係,請你計算出這個專案的最早完工時間。輸入格式 首先第一行給出兩個正整數 專案里程碑的數量 n 100 和任務總數 m。這裡的里程碑...