乙個專案由若干個任務組成,任務之間有先後依賴順序。專案經理需要設定一系列里程碑,在每個里程碑節點處檢查任務的完成情況,並啟動後續的任務。現給定乙個專案中各個任務之間的關係,請你計算出這個專案的最早完工時間。
首先第一行給出兩個正整數:專案里程碑的數量 n(≤100)和任務總數 m。這裡的里程碑從 0 到 n−1 編號。隨後 m 行,每行給出一項任務的描述,格式為「任務起始里程碑 任務結束里程碑 工作時長」,三個數字均為非負整數,以空格分隔。
如果整個專案的安排是合理可行的,在一行中輸出最早完工時間;否則輸出"impossible"。
9 120 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 50 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。這裡的里程碑...