description
張三是某工程公司的專案工程師。一天公司接下一項大型工程,該公司在大型工程的施工前,先要把整個工程劃分為若干個子工程,並把這些子工程編號為1、2、…、n;這樣劃分之後,子工程之間就會有一些依賴關係,即一些子工程必須在某些子工程完成之後才能施工,公司需要工程師張三計算整個工程最少的完成時間。
對於上面問題,可以假設:
1、根據預算,每乙個子工程都有乙個完成時間。
2、子工程之間的依賴關係是:部分子工程必須在一些子工程完成之後才開工。
3、只要滿足子工程間的依賴關係,在任何時刻可以有任何多個子工程同時在施工,也即同時施工的子工程個數不受限制。
例如:有五個子工程的工程規劃表:
現在對於給定的子工程規劃情況,及每個子工程完成所需的時間,如果子工程劃分合理則求出完成整個工程最少要用的時間,如果子工程劃分不合理,則輸出-1。
input
第1行為正整數n,表示子工程的個數(n<=200)
第2行為n個正整數,分別代表子工程1、2、…、n的完成時間。
第3行到n+2行,每行有n-1個0或1,其中的第k+2行的這些0或1,分別表示「子工程k」與子工程1、2、…、k-1、k+1、…、n的依賴關係(k=1、2、…、n)。每行資料之間均用空格分開。
output
如果子工程劃分合理則輸出完成整個工程最少要用的時間,如果子工程劃分不合理,則輸出-1。
sample input
project.in
5
5 4 12 7 2
0 0 0 0
0 0 0 0
0 0 0 0
1 1 0 0
1 1 1 1
project.in5
5 4 12 7 2
0 1 0 0
0 0 0 0
0 0 1 0
1 1 0 0
1 1 1 1
sample output
project.out
14
project.out-1
解題思路
做乙個拓撲排序,從頂頭的那個沒有前提條件的工程開始做
輸出-1的情況只有乙個,圖**現環,那麼拓撲排序無法排序到所有點,只需要特判這個就好了
code
#include
#include
#include
using namespace std;
int n,ans,sum,
inf,ti[
300]
,c[300][
300]
,f[300
],s[
300]
,ru[
300]
;int h,t,q[
300]
;void
dfs()}
}int main()
sum=n;
for(int i=
1;i<=n;i++)if
(!ru[i]
)//沒有入度代表沒有前提條件,可以直接做
q[++t]
=i,sum--
,f[i]
=ti[i]
;dfs()
;for
(int i=
1;i<=n;i++
) ans=
max(ans,f[i]);
if(sum)
printf
("-1");
else
printf
("%d"
,ans)
;}
拓撲排序 工程
張三是某工程公司的專案工程師。一天公司接下一項大型工程,該公司在大型工程的施工前,先要把整個工程劃分為若干個子工程,並把這些子工程編號為1,2 n 1,2,n 1,2,n 這樣劃分之後,子工程之間就會有一些依賴關係,即一些子工程必須在某些子工程完成之後才能施工,公司需要工程師張三計算整個工程最少的完...
工程安排(拓撲排序)
讀入檔案project.txt 810 1 2 3 4 5 6 7 8 1,2,6,a 1,5,2,b 2,3,3,c 2,4,5,d 2,5,3,e 3,7,2,f 4,7,3,g 5,6,4,h 6,7,2,i 7,8,2,j include include include define max...
python 拓撲排序 Python 拓撲排序
python 拓撲排序 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序 英語 topological sorting 每個頂點出現且只出現一次 若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。print 拓撲排序結果 g.topologicalso...