拓撲排序 工程

2021-10-09 06:11:29 字數 1941 閱讀 5661

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.in
5

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...